aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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