lkml.org 
[lkml]   [2015]   [Jun]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 16/17] x86/tsc: Use rdtsc_ordered() in check_tsc_warp() and drop extra barriers
    Date
    Using get_cycles was unnecessary: check_tsc_warp() is not called on
    TSC-less systems. Replace barrier_before_rdtsc(); get_cycles() with
    rdtsc_ordered().

    While we're at it, make the somewhat more dangerous change of
    removing barrier_before_rdtsc after RDTSC in the TSC warp check
    code. This should be okay, though -- the vDSO TSC code doesn't have
    that barrier, so, if removing the barrier from the warp check would
    cause us to detect a warp that we otherwise wouldn't detect, then we
    have a genuine bug.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    ---
    arch/x86/kernel/tsc_sync.c | 14 ++++++--------
    1 file changed, 6 insertions(+), 8 deletions(-)

    diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c
    index cf36e9befb39..78083bf23ed1 100644
    --- a/arch/x86/kernel/tsc_sync.c
    +++ b/arch/x86/kernel/tsc_sync.c
    @@ -39,16 +39,15 @@ static cycles_t max_warp;
    static int nr_warps;

    /*
    - * TSC-warp measurement loop running on both CPUs:
    + * TSC-warp measurement loop running on both CPUs. This is not called
    + * if there is no TSC.
    */
    static void check_tsc_warp(unsigned int timeout)
    {
    cycles_t start, now, prev, end;
    int i;

    - barrier_before_rdtsc();
    - start = get_cycles();
    - barrier_before_rdtsc();
    + start = rdtsc_ordered();
    /*
    * The measurement runs for 'timeout' msecs:
    */
    @@ -63,9 +62,7 @@ static void check_tsc_warp(unsigned int timeout)
    */
    arch_spin_lock(&sync_lock);
    prev = last_tsc;
    - barrier_before_rdtsc();
    - now = get_cycles();
    - barrier_before_rdtsc();
    + now = rdtsc_ordered();
    last_tsc = now;
    arch_spin_unlock(&sync_lock);

    @@ -126,7 +123,7 @@ void check_tsc_sync_source(int cpu)

    /*
    * No need to check if we already know that the TSC is not
    - * synchronized:
    + * synchronized or if we have no TSC.
    */
    if (unsynchronized_tsc())
    return;
    @@ -190,6 +187,7 @@ void check_tsc_sync_target(void)
    {
    int cpus = 2;

    + /* Also aborts if there is no TSC. */
    if (unsynchronized_tsc() || tsc_clocksource_reliable)
    return;

    --
    2.4.2


    \
     
     \ /
      Last update: 2015-06-13 02:01    [W:2.278 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site