diff options
Diffstat (limited to 'arch/x86/kernel/kvmclock.c')
-rw-r--r-- | arch/x86/kernel/kvmclock.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index e811d4d1c824..904494b924c1 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c | |||
@@ -104,12 +104,8 @@ static u64 kvm_sched_clock_read(void) | |||
104 | 104 | ||
105 | static inline void kvm_sched_clock_init(bool stable) | 105 | static inline void kvm_sched_clock_init(bool stable) |
106 | { | 106 | { |
107 | if (!stable) { | 107 | if (!stable) |
108 | pv_ops.time.sched_clock = kvm_clock_read; | ||
109 | clear_sched_clock_stable(); | 108 | clear_sched_clock_stable(); |
110 | return; | ||
111 | } | ||
112 | |||
113 | kvm_sched_clock_offset = kvm_clock_read(); | 109 | kvm_sched_clock_offset = kvm_clock_read(); |
114 | pv_ops.time.sched_clock = kvm_sched_clock_read; | 110 | pv_ops.time.sched_clock = kvm_sched_clock_read; |
115 | 111 | ||
@@ -355,6 +351,20 @@ void __init kvmclock_init(void) | |||
355 | machine_ops.crash_shutdown = kvm_crash_shutdown; | 351 | machine_ops.crash_shutdown = kvm_crash_shutdown; |
356 | #endif | 352 | #endif |
357 | kvm_get_preset_lpj(); | 353 | kvm_get_preset_lpj(); |
354 | |||
355 | /* | ||
356 | * X86_FEATURE_NONSTOP_TSC is TSC runs at constant rate | ||
357 | * with P/T states and does not stop in deep C-states. | ||
358 | * | ||
359 | * Invariant TSC exposed by host means kvmclock is not necessary: | ||
360 | * can use TSC as clocksource. | ||
361 | * | ||
362 | */ | ||
363 | if (boot_cpu_has(X86_FEATURE_CONSTANT_TSC) && | ||
364 | boot_cpu_has(X86_FEATURE_NONSTOP_TSC) && | ||
365 | !check_tsc_unstable()) | ||
366 | kvm_clock.rating = 299; | ||
367 | |||
358 | clocksource_register_hz(&kvm_clock, NSEC_PER_SEC); | 368 | clocksource_register_hz(&kvm_clock, NSEC_PER_SEC); |
359 | pv_info.name = "KVM"; | 369 | pv_info.name = "KVM"; |
360 | } | 370 | } |