diff options
Diffstat (limited to 'arch/x86/kernel/tsc.c')
-rw-r--r-- | arch/x86/kernel/tsc.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index d57de05dc430..3e1c057e98fe 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -384,13 +384,13 @@ unsigned long native_calibrate_tsc(void) | |||
384 | { | 384 | { |
385 | u64 tsc1, tsc2, delta, ref1, ref2; | 385 | u64 tsc1, tsc2, delta, ref1, ref2; |
386 | unsigned long tsc_pit_min = ULONG_MAX, tsc_ref_min = ULONG_MAX; | 386 | unsigned long tsc_pit_min = ULONG_MAX, tsc_ref_min = ULONG_MAX; |
387 | unsigned long flags, latch, ms, fast_calibrate, tsc_khz; | 387 | unsigned long flags, latch, ms, fast_calibrate, hv_tsc_khz; |
388 | int hpet = is_hpet_enabled(), i, loopmin; | 388 | int hpet = is_hpet_enabled(), i, loopmin; |
389 | 389 | ||
390 | tsc_khz = get_hypervisor_tsc_freq(); | 390 | hv_tsc_khz = get_hypervisor_tsc_freq(); |
391 | if (tsc_khz) { | 391 | if (hv_tsc_khz) { |
392 | printk(KERN_INFO "TSC: Frequency read from the hypervisor\n"); | 392 | printk(KERN_INFO "TSC: Frequency read from the hypervisor\n"); |
393 | return tsc_khz; | 393 | return hv_tsc_khz; |
394 | } | 394 | } |
395 | 395 | ||
396 | local_irq_save(flags); | 396 | local_irq_save(flags); |
@@ -710,7 +710,16 @@ static cycle_t read_tsc(struct clocksource *cs) | |||
710 | #ifdef CONFIG_X86_64 | 710 | #ifdef CONFIG_X86_64 |
711 | static cycle_t __vsyscall_fn vread_tsc(void) | 711 | static cycle_t __vsyscall_fn vread_tsc(void) |
712 | { | 712 | { |
713 | cycle_t ret = (cycle_t)vget_cycles(); | 713 | cycle_t ret; |
714 | |||
715 | /* | ||
716 | * Surround the RDTSC by barriers, to make sure it's not | ||
717 | * speculated to outside the seqlock critical section and | ||
718 | * does not cause time warps: | ||
719 | */ | ||
720 | rdtsc_barrier(); | ||
721 | ret = (cycle_t)vget_cycles(); | ||
722 | rdtsc_barrier(); | ||
714 | 723 | ||
715 | return ret >= __vsyscall_gtod_data.clock.cycle_last ? | 724 | return ret >= __vsyscall_gtod_data.clock.cycle_last ? |
716 | ret : __vsyscall_gtod_data.clock.cycle_last; | 725 | ret : __vsyscall_gtod_data.clock.cycle_last; |