public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH]: pointer to vmcs getting lost
@ 2008-08-01 22:18 Jesse
  2008-08-01 23:24 ` Marcelo Tosatti
  0 siblings, 1 reply; 6+ messages in thread
From: Jesse @ 2008-08-01 22:18 UTC (permalink / raw)
  To: kvm

Greetings,

I noticed a race condition when running two guests simultaneously and 
debugging both guests (on 64-bit intel cpus). Periodically I would get 
errors from the vmread, vmwrite, or vmresume instructions. Some research 
revealed that these errors were being caused by having an invalid vmcs 
loaded. Further, I found that the vmcs is a per_cpu variable, which I 
believe means that any reference to it is invalid after a context 
switch. (Corrections appreciated). This means that the vmcs must be 
reloaded each time the process is switched to. The patch below fixed the 
problem for me.

This patch does three things.
1. Extends the critical section in __vcpu_run to include the handling of 
vmexits, where many of the vmread/writes occur.
2. Perform a vcpu_load after we enter the critical section, and after we 
return from kvm_resched.
3. Move the call to kvm_guest_debug_pre into the critical section 
(because it calls vmread/write).

I hope you find this useful. I am not on list, so please CC me on replies.

~Jesse Dutton

 

diff -ruNa kvm-72/kernel/x86.c kvm-72-changed/kernel/x86.c
--- kvm-72/kernel/x86.c	2008-07-27 06:20:10.000000000 -0700
+++ kvm-72-changed/kernel/x86.c	2008-07-31 15:25:25.000000000 -0700
@@ -2845,8 +2845,6 @@
 	vapic_enter(vcpu);
 
 preempted:
-	if (vcpu->guest_debug.enabled)
-		kvm_x86_ops->guest_debug_pre(vcpu);
 
 again:
 	if (vcpu->requests)
@@ -2878,7 +2876,12 @@
 	clear_bit(KVM_REQ_PENDING_TIMER, &vcpu->requests);
 	kvm_inject_pending_timer_irqs(vcpu);
 
+	vcpu_put(vcpu);
 	preempt_disable();
+	vcpu_load(vcpu);
+
+	if (vcpu->guest_debug.enabled)
+		kvm_x86_ops->guest_debug_pre(vcpu);
 
 	kvm_x86_ops->prepare_guest_switch(vcpu);
 	kvm_load_guest_fpu(vcpu);
@@ -2941,7 +2944,6 @@
 
 	kvm_guest_exit();
 
-	preempt_enable();
 
 	down_read(&vcpu->kvm->slots_lock);
 
@@ -2960,6 +2962,8 @@
 
 	r = kvm_x86_ops->handle_exit(kvm_run, vcpu);
 
+	preempt_enable();
+
 	if (r > 0) {
 		if (dm_request_for_irq_injection(vcpu, kvm_run)) {
 			r = -EINTR;
@@ -2974,7 +2978,9 @@
 out:
 	up_read(&vcpu->kvm->slots_lock);
 	if (r > 0) {
+		vcpu_put(vcpu);
 		kvm_resched(vcpu);
+		vcpu_load(vcpu);
 		down_read(&vcpu->kvm->slots_lock);
 		goto preempted;
 	}



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-08-11 11:48 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-01 22:18 [PATCH]: pointer to vmcs getting lost Jesse
2008-08-01 23:24 ` Marcelo Tosatti
2008-08-01 23:36   ` Jesse
2008-08-02 16:31     ` Marcelo Tosatti
2008-08-03  0:11       ` Jesse
2008-08-11 11:48         ` Avi Kivity

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox