aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2012-08-22 11:03:50 -0400
committerAlexander Graf <agraf@suse.de>2012-10-05 17:38:54 -0400
commit5bd1cf118533aba41b3fbd4834e6362a9237db71 (patch)
tree33cf8766cec82d210d95755a8291855c7f199705
parentadbb48a854bf8dee556dc42b96dd61503351a82d (diff)
KVM: PPC: set IN_GUEST_MODE before checking requests
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>
-rw-r--r--arch/powerpc/kvm/booke.c1
-rw-r--r--arch/powerpc/kvm/powerpc.c14
2 files changed, 9 insertions, 6 deletions
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 69d047c22d2..3d1f35dc786 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -674,7 +674,6 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
674 674
675out: 675out:
676 vcpu->mode = OUTSIDE_GUEST_MODE; 676 vcpu->mode = OUTSIDE_GUEST_MODE;
677 smp_wmb();
678 return ret; 677 return ret;
679} 678}
680 679
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 6002ea938a4..deb0d596d81 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -78,7 +78,16 @@ int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu)
78 break; 78 break;
79 } 79 }
80 80
81 vcpu->mode = IN_GUEST_MODE;
82
83 /*
84 * Reading vcpu->requests must happen after setting vcpu->mode,
85 * so we don't miss a request because the requester sees
86 * OUTSIDE_GUEST_MODE and assumes we'll be checking requests
87 * before next entering the guest (and thus doesn't IPI).
88 */
81 smp_mb(); 89 smp_mb();
90
82 if (vcpu->requests) { 91 if (vcpu->requests) {
83 /* Make sure we process requests preemptable */ 92 /* Make sure we process requests preemptable */
84 local_irq_enable(); 93 local_irq_enable();
@@ -111,11 +120,6 @@ int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu)
111#endif 120#endif
112 121
113 kvm_guest_enter(); 122 kvm_guest_enter();
114
115 /* Going into guest context! Yay! */
116 vcpu->mode = IN_GUEST_MODE;
117 smp_wmb();
118
119 break; 123 break;
120 } 124 }
121 125