diff options
Diffstat (limited to 'arch/x86/kernel/tsc_sync.c')
| -rw-r--r-- | arch/x86/kernel/tsc_sync.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index 9ffb01c31c4..bf36328f6ef 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c @@ -46,7 +46,9 @@ static __cpuinit void check_tsc_warp(void)  	cycles_t start, now, prev, end;  	int i; +	rdtsc_barrier();  	start = get_cycles(); +	rdtsc_barrier();  	/*  	 * The measurement runs for 20 msecs:  	 */ @@ -61,7 +63,9 @@ static __cpuinit void check_tsc_warp(void)  		 */  		__raw_spin_lock(&sync_lock);  		prev = last_tsc; +		rdtsc_barrier();  		now = get_cycles(); +		rdtsc_barrier();  		last_tsc = now;  		__raw_spin_unlock(&sync_lock); @@ -108,6 +112,12 @@ void __cpuinit check_tsc_sync_source(int cpu)  	if (unsynchronized_tsc())  		return; +	if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE)) { +		printk(KERN_INFO +		       "Skipping synchronization checks as TSC is reliable.\n"); +		return; +	} +  	printk(KERN_INFO "checking TSC synchronization [CPU#%d -> CPU#%d]:",  			  smp_processor_id(), cpu); @@ -161,7 +171,7 @@ void __cpuinit check_tsc_sync_target(void)  {  	int cpus = 2; -	if (unsynchronized_tsc()) +	if (unsynchronized_tsc() || boot_cpu_has(X86_FEATURE_TSC_RELIABLE))  		return;  	/*  |