KVM: PPC: Add return value in prepare_to_enter
authorAlexander Graf <agraf@suse.de>
Mon, 13 Aug 2012 10:44:41 +0000 (12:44 +0200)
committerAlexander Graf <agraf@suse.de>
Fri, 5 Oct 2012 21:38:46 +0000 (23:38 +0200)
Our prepare_to_enter helper wants to be able to return in more circumstances
to the host than only when an interrupt is pending. Broaden the interface a
bit and move even more generic code to the generic helper.

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

index 1ff0d6ccc5897856d83a1d728d1d513213e4da32..71fa0f1873b3c1c6a19dab11bcfc9e5e513d0edb 100644 (file)
@@ -589,6 +589,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
                        unsigned int exit_nr)
 {
        int r = RESUME_HOST;
+       int s;
 
        vcpu->stat.sum_exits++;
 
@@ -862,10 +863,10 @@ program_interrupt:
                 * again due to a host external interrupt.
                 */
                local_irq_disable();
-               if (kvmppc_prepare_to_enter(vcpu)) {
+               s = kvmppc_prepare_to_enter(vcpu);
+               if (s <= 0) {
                        local_irq_enable();
-                       run->exit_reason = KVM_EXIT_INTR;
-                       r = -EINTR;
+                       r = s;
                } else {
                        kvmppc_lazy_ee_enable();
                }
@@ -1074,10 +1075,9 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
         * a host external interrupt.
         */
        local_irq_disable();
-       if (kvmppc_prepare_to_enter(vcpu)) {
+       ret = kvmppc_prepare_to_enter(vcpu);
+       if (ret <= 0) {
                local_irq_enable();
-               kvm_run->exit_reason = KVM_EXIT_INTR;
-               ret = -EINTR;
                goto out;
        }
 
index 5e8dc19091304b9424981b1280f206e7da2fe25c..1917802463f5a765afaa74e79eb9914dac542f79 100644 (file)
@@ -467,7 +467,7 @@ void kvmppc_core_check_requests(struct kvm_vcpu *vcpu)
 
 int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
 {
-       int ret;
+       int ret, s;
 #ifdef CONFIG_PPC_FPU
        unsigned int fpscr;
        int fpexc_mode;
@@ -480,10 +480,10 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
        }
 
        local_irq_disable();
-       if (kvmppc_prepare_to_enter(vcpu)) {
+       s = kvmppc_prepare_to_enter(vcpu);
+       if (s <= 0) {
                local_irq_enable();
-               kvm_run->exit_reason = KVM_EXIT_INTR;
-               ret = -EINTR;
+               ret = s;
                goto out;
        }
        kvmppc_lazy_ee_enable();
@@ -642,6 +642,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
                        unsigned int exit_nr)
 {
        int r = RESUME_HOST;
+       int s;
 
        /* update before a new last_exit_type is rewritten */
        kvmppc_update_timing_stats(vcpu);
@@ -948,11 +949,10 @@ 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)) {
+               s = kvmppc_prepare_to_enter(vcpu);
+               if (s <= 0) {
                        local_irq_enable();
-                       run->exit_reason = KVM_EXIT_INTR;
-                       r = (-EINTR << 2) | RESUME_HOST | (r & RESUME_FLAG_NV);
-                       kvmppc_account_exit(vcpu, SIGNAL_EXITS);
+                       r = (s << 2) | RESUME_HOST | (r & RESUME_FLAG_NV);
                } else {
                        kvmppc_lazy_ee_enable();
                }
index dc86371b9953dee0c761d985fca937c7873d4ea2..0e2a98ab6a77147ae97b449bde6514bfc378ba77 100644 (file)
@@ -53,11 +53,14 @@ int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
  * Common checks before entering the guest world.  Call with interrupts
  * disabled.
  *
- * returns !0 if a signal is pending and check_signal is true
+ * returns:
+ *
+ * == 1 if we're ready to go into guest state
+ * <= 0 if we need to go back to the host with return value
  */
 int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu)
 {
-       int r = 0;
+       int r = 1;
 
        WARN_ON_ONCE(!irqs_disabled());
        while (true) {
@@ -69,7 +72,9 @@ int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu)
                }
 
                if (signal_pending(current)) {
-                       r = 1;
+                       kvmppc_account_exit(vcpu, SIGNAL_EXITS);
+                       vcpu->run->exit_reason = KVM_EXIT_INTR;
+                       r = -EINTR;
                        break;
                }