aboutsummaryrefslogtreecommitdiffstats
path: root/virt
diff options
context:
space:
mode:
authorZachary Amsden <zamsden@redhat.com>2010-08-20 04:07:28 -0400
committerAvi Kivity <avi@redhat.com>2010-10-24 04:51:24 -0400
commitca84d1a24c376e0841f35db08dab7b829c8c0b1e (patch)
tree05da8ca898b202c578d2aebcc9534eddec52b8ec /virt
parent46543ba45fc4b64ca32655efdc8d9c599b4164e2 (diff)
KVM: x86: Add clock sync request to hardware enable
If there are active VCPUs which are marked as belonging to a particular hardware CPU, request a clock sync for them when enabling hardware; the TSC could be desynchronized on a newly arriving CPU, and we need to recompute guests system time relative to boot after a suspend event. This covers both cases. Note that it is acceptable to take the spinlock, as either no other tasks will be running and no locks held (BSP after resume), or other tasks will be guaranteed to drop the lock relatively quickly (AP on CPU_STARTING). Noting we now get clock synchronization requests for VCPUs which are starting up (or restarting), it is tempting to attempt to remove the arch/x86/kvm/x86.c CPU hot-notifiers at this time, however it is not correct to do so; they are required for systems with non-constant TSC as the frequency may not be known immediately after the processor has started until the cpufreq driver has had a chance to run and query the chipset. Updated: implement better locking semantics for hardware_enable Removed the hack of dropping and retaking the lock by adding the semantic that we always hold kvm_lock when hardware_enable is called. The one place that doesn't need to worry about it is resume, as resuming a frozen CPU, the spinlock won't be taken. Signed-off-by: Zachary Amsden <zamsden@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'virt')
-rw-r--r--virt/kvm/kvm_main.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 5186e728c53e..da117a6b1e2e 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1961,7 +1961,9 @@ static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val,
1961 case CPU_STARTING: 1961 case CPU_STARTING:
1962 printk(KERN_INFO "kvm: enabling virtualization on CPU%d\n", 1962 printk(KERN_INFO "kvm: enabling virtualization on CPU%d\n",
1963 cpu); 1963 cpu);
1964 spin_lock(&kvm_lock);
1964 hardware_enable(NULL); 1965 hardware_enable(NULL);
1966 spin_unlock(&kvm_lock);
1965 break; 1967 break;
1966 } 1968 }
1967 return NOTIFY_OK; 1969 return NOTIFY_OK;
@@ -2168,8 +2170,10 @@ static int kvm_suspend(struct sys_device *dev, pm_message_t state)
2168 2170
2169static int kvm_resume(struct sys_device *dev) 2171static int kvm_resume(struct sys_device *dev)
2170{ 2172{
2171 if (kvm_usage_count) 2173 if (kvm_usage_count) {
2174 WARN_ON(spin_is_locked(&kvm_lock));
2172 hardware_enable(NULL); 2175 hardware_enable(NULL);
2176 }
2173 return 0; 2177 return 0;
2174} 2178}
2175 2179