Commit 93ce99e8 authored by Venki Pallipadi's avatar Venki Pallipadi Committed by Ingo Molnar

x86: add rdtsc barrier to TSC sync check

Impact: fix incorrectly marked unstable TSC clock

Patch (commit 0d12cdd5 "sched: improve sched_clock() performance") has
a regression on one of the test systems here.

With the patch, I see:

 checking TSC synchronization [CPU#0 -> CPU#1]:
 Measured 28 cycles TSC warp between CPUs, turning off TSC clock.
 Marking TSC unstable due to check_tsc_sync_source failed

Whereas, without the patch syncs pass fine on all CPUs:

 checking TSC synchronization [CPU#0 -> CPU#1]: passed.

Due to this, TSC is marked unstable, when it is not actually unstable.
This is because syncs in check_tsc_wrap() goes away due to this commit.

As per the discussion on this thread, correct way to fix this is to add
explicit syncs as below?
Signed-off-by: default avatarVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 26a3e991
...@@ -46,7 +46,9 @@ static __cpuinit void check_tsc_warp(void) ...@@ -46,7 +46,9 @@ static __cpuinit void check_tsc_warp(void)
cycles_t start, now, prev, end; cycles_t start, now, prev, end;
int i; int i;
rdtsc_barrier();
start = get_cycles(); start = get_cycles();
rdtsc_barrier();
/* /*
* The measurement runs for 20 msecs: * The measurement runs for 20 msecs:
*/ */
...@@ -61,7 +63,9 @@ static __cpuinit void check_tsc_warp(void) ...@@ -61,7 +63,9 @@ static __cpuinit void check_tsc_warp(void)
*/ */
__raw_spin_lock(&sync_lock); __raw_spin_lock(&sync_lock);
prev = last_tsc; prev = last_tsc;
rdtsc_barrier();
now = get_cycles(); now = get_cycles();
rdtsc_barrier();
last_tsc = now; last_tsc = now;
__raw_spin_unlock(&sync_lock); __raw_spin_unlock(&sync_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment