KVM: x86: Harden against cpufreq
authorZachary Amsden <zamsden@redhat.com>
Sat, 10 Oct 2009 02:26:08 +0000 (16:26 -1000)
committerAvi Kivity <avi@redhat.com>
Thu, 3 Dec 2009 07:32:18 +0000 (09:32 +0200)
If cpufreq can't determine the CPU khz, or cpufreq is not compiled in,
we should fallback to the measured TSC khz.

Signed-off-by: Zachary Amsden <zamsden@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/kvm/x86.c

index 098e7f886306c93b16f8b9ea469b79d130e1e372..3cffa2cac70b8ee10400639bb2ec901a5c2cf270 100644 (file)
@@ -1348,8 +1348,12 @@ out:
 void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
 {
        kvm_x86_ops->vcpu_load(vcpu, cpu);
-       if (unlikely(per_cpu(cpu_tsc_khz, cpu) == 0))
-               per_cpu(cpu_tsc_khz, cpu) = cpufreq_quick_get(cpu);
+       if (unlikely(per_cpu(cpu_tsc_khz, cpu) == 0)) {
+               unsigned long khz = cpufreq_quick_get(cpu);
+               if (!khz)
+                       khz = tsc_khz;
+               per_cpu(cpu_tsc_khz, cpu) = khz;
+       }
        kvm_request_guest_time_update(vcpu);
 }
 
@@ -3144,8 +3148,12 @@ static void kvm_timer_init(void)
        if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) {
                cpufreq_register_notifier(&kvmclock_cpufreq_notifier_block,
                                          CPUFREQ_TRANSITION_NOTIFIER);
-               for_each_online_cpu(cpu)
-                       per_cpu(cpu_tsc_khz, cpu) = cpufreq_get(cpu);
+               for_each_online_cpu(cpu) {
+                       unsigned long khz = cpufreq_get(cpu);
+                       if (!khz)
+                               khz = tsc_khz;
+                       per_cpu(cpu_tsc_khz, cpu) = khz;
+               }
        } else {
                for_each_possible_cpu(cpu)
                        per_cpu(cpu_tsc_khz, cpu) = tsc_khz;