KVM: s390: sigp: split handling of SIGP STOP (AND STORE STATUS)
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>
Fri, 6 Jun 2014 08:25:09 +0000 (10:25 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Tue, 28 Oct 2014 12:09:14 +0000 (13:09 +0100)
In preparation for further code changes (e.g. getting rid of action_flags),
this patch splits the handling of the two sigp orders SIGP STOP and SIGP STOP
AND STORE STATUS by introducing a separate handler function for SIGP STOP AND
STORE STATUS.

Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/kvm/sigp.c

index 1b330d4eb20b3e3337b50ff4974bcf88e3e0ca77..f7cd3f774f250ecab11dd26001f302a965d7ef4e 100644 (file)
@@ -147,15 +147,27 @@ out:
        return rc;
 }
 
-static int __sigp_stop(struct kvm_vcpu *vcpu, struct kvm_vcpu *dst_vcpu,
-                      int action)
+static int __sigp_stop(struct kvm_vcpu *vcpu, struct kvm_vcpu *dst_vcpu)
 {
        int rc;
 
-       rc = __inject_sigp_stop(dst_vcpu, action);
+       rc = __inject_sigp_stop(dst_vcpu, ACTION_STOP_ON_STOP);
        VCPU_EVENT(vcpu, 4, "sent sigp stop to cpu %x", dst_vcpu->vcpu_id);
 
-       if ((action & ACTION_STORE_ON_STOP) != 0 && rc == -ESHUTDOWN) {
+       return rc;
+}
+
+static int __sigp_stop_and_store_status(struct kvm_vcpu *vcpu,
+                                       struct kvm_vcpu *dst_vcpu, u64 *reg)
+{
+       int rc;
+
+       rc = __inject_sigp_stop(dst_vcpu, ACTION_STOP_ON_STOP |
+                                             ACTION_STORE_ON_STOP);
+       VCPU_EVENT(vcpu, 4, "sent sigp stop and store status to cpu %x",
+                  dst_vcpu->vcpu_id);
+
+       if (rc == -ESHUTDOWN) {
                /* If the CPU has already been stopped, we still have
                 * to save the status when doing stop-and-store. This
                 * has to be done after unlocking all spinlocks. */
@@ -347,12 +359,11 @@ static int handle_sigp_dst(struct kvm_vcpu *vcpu, u8 order_code,
                break;
        case SIGP_STOP:
                vcpu->stat.instruction_sigp_stop++;
-               rc = __sigp_stop(vcpu, dst_vcpu, ACTION_STOP_ON_STOP);
+               rc = __sigp_stop(vcpu, dst_vcpu);
                break;
        case SIGP_STOP_AND_STORE_STATUS:
                vcpu->stat.instruction_sigp_stop_store_status++;
-               rc = __sigp_stop(vcpu, dst_vcpu, ACTION_STORE_ON_STOP |
-                                                ACTION_STOP_ON_STOP);
+               rc = __sigp_stop_and_store_status(vcpu, dst_vcpu, status_reg);
                break;
        case SIGP_STORE_STATUS_AT_ADDRESS:
                vcpu->stat.instruction_sigp_store_status++;