KVM: PPC: Consistentify vcpu exit path
authorAlexander Graf <agraf@suse.de>
Sun, 12 Aug 2012 10:42:30 +0000 (12:42 +0200)
committerAlexander Graf <agraf@suse.de>
Fri, 5 Oct 2012 21:38:45 +0000 (23:38 +0200)
When getting out of __vcpu_run, let's be consistent about the state we
return in. We want to always

  * have IRQs enabled
  * have called kvm_guest_exit before

Signed-off-by: Alexander Graf <agraf@suse.de>
arch/powerpc/kvm/book3s_pr.c
arch/powerpc/kvm/booke.c

index 9430a362e5a3c5e544c4ce8c3adfb4b72698c127..3dec346c4b93301d80f73518022d75c9f940c9f8 100644 (file)
@@ -868,12 +868,15 @@ program_interrupt:
                 */
                __hard_irq_disable();
                if (kvmppc_prepare_to_enter(vcpu)) {
+                       /* local_irq_enable(); */
                        run->exit_reason = KVM_EXIT_INTR;
                        r = -EINTR;
+               } else {
+                       /* Going back to guest */
+                       kvm_guest_enter();
                }
        }
 
-       kvm_guest_enter();
        trace_kvm_book3s_reenter(r, vcpu);
 
        return r;
@@ -1123,7 +1126,8 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
 
        ret = __kvmppc_vcpu_run(kvm_run, vcpu);
 
-       kvm_guest_exit();
+       /* No need for kvm_guest_exit. It's done in handle_exit.
+          We also get here with interrupts enabled. */
 
        current->thread.regs->msr = ext_msr;
 
index 887c7cc0214621e79610d586b023a3c49d4493be..aae535f6d9de3f9dc46ba0e5319f642d2dee2905 100644 (file)
@@ -481,6 +481,7 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
 
        local_irq_disable();
        if (kvmppc_prepare_to_enter(vcpu)) {
+               local_irq_enable();
                kvm_run->exit_reason = KVM_EXIT_INTR;
                ret = -EINTR;
                goto out;
@@ -512,6 +513,9 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
 
        ret = __kvmppc_vcpu_run(kvm_run, vcpu);
 
+       /* No need for kvm_guest_exit. It's done in handle_exit.
+          We also get here with interrupts enabled. */
+
 #ifdef CONFIG_PPC_FPU
        kvmppc_save_guest_fp(vcpu);
 
@@ -527,12 +531,9 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
        current->thread.fpexc_mode = fpexc_mode;
 #endif
 
-       kvm_guest_exit();
-
 out:
        vcpu->mode = OUTSIDE_GUEST_MODE;
        smp_wmb();
-       local_irq_enable();
        return ret;
 }
 
@@ -947,14 +948,16 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
        if (!(r & RESUME_HOST)) {
                local_irq_disable();
                if (kvmppc_prepare_to_enter(vcpu)) {
+                       local_irq_enable();
                        run->exit_reason = KVM_EXIT_INTR;
                        r = (-EINTR << 2) | RESUME_HOST | (r & RESUME_FLAG_NV);
                        kvmppc_account_exit(vcpu, SIGNAL_EXITS);
+               } else {
+                       /* Going back to guest */
+                       kvm_guest_enter();
                }
        }
 
-       kvm_guest_enter();
-
        return r;
 }