diff options
author | Scott Wood <scottwood@freescale.com> | 2012-08-22 11:03:50 -0400 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2012-10-05 17:38:54 -0400 |
commit | 5bd1cf118533aba41b3fbd4834e6362a9237db71 (patch) | |
tree | 33cf8766cec82d210d95755a8291855c7f199705 | |
parent | adbb48a854bf8dee556dc42b96dd61503351a82d (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.c | 1 | ||||
-rw-r--r-- | arch/powerpc/kvm/powerpc.c | 14 |
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 | ||
675 | out: | 675 | out: |
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 | ||