KVM: PPC: set IN_GUEST_MODE before checking requests
authorScott Wood <scottwood@freescale.com>
Wed, 22 Aug 2012 15:03:50 +0000 (15:03 +0000)
committerAlexander Graf <agraf@suse.de>
Fri, 5 Oct 2012 21:38:54 +0000 (23:38 +0200)
Avoid a race as described in the code comment.

Also remove a related smp_wmb() from booke's kvmppc_prepare_to_enter().
I can't see any reason for it, and the book3s_pr version doesn't have it.

Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
arch/powerpc/kvm/booke.c
arch/powerpc/kvm/powerpc.c

index 69d047c22d20b2defdb19ed52003a1387e5abe9f..3d1f35dc786281f5640ebf825a752f5ae19c2231 100644 (file)
@@ -674,7 +674,6 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
 
 out:
        vcpu->mode = OUTSIDE_GUEST_MODE;
-       smp_wmb();
        return ret;
 }
 
index 6002ea938a484ab57e626b534cb6b93c0f38affe..deb0d596d815fca2457c415d774144702869f60e 100644 (file)
@@ -78,7 +78,16 @@ int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu)
                        break;
                }
 
+               vcpu->mode = IN_GUEST_MODE;
+
+               /*
+                * Reading vcpu->requests must happen after setting vcpu->mode,
+                * so we don't miss a request because the requester sees
+                * OUTSIDE_GUEST_MODE and assumes we'll be checking requests
+                * before next entering the guest (and thus doesn't IPI).
+                */
                smp_mb();
+
                if (vcpu->requests) {
                        /* Make sure we process requests preemptable */
                        local_irq_enable();
@@ -111,11 +120,6 @@ int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu)
 #endif
 
                kvm_guest_enter();
-
-               /* Going into guest context! Yay! */
-               vcpu->mode = IN_GUEST_MODE;
-               smp_wmb();
-
                break;
        }