Commit 9e0d5473e2f0ba2d2fe9dab9408edef3060b710e

Authored by Jens Freimann
Committed by Avi Kivity
1 parent 851755871c

KVM: s390: do store status after handling STOP_ON_STOP bit

In handle_stop() handle the stop bit before doing the store status as
described for "Stop and Store Status" in the Principles of Operation.
We have to give up the local_int.lock before calling kvm store status
since it calls gmap_fault() which might sleep. Since local_int.lock
only protects local_int.* and not guest memory we can give up the lock.

Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>

Showing 1 changed file with 12 additions and 8 deletions Side-by-side Diff

arch/s390/kvm/intercept.c
... ... @@ -133,13 +133,6 @@
133 133  
134 134 vcpu->stat.exit_stop_request++;
135 135 spin_lock_bh(&vcpu->arch.local_int.lock);
136   - if (vcpu->arch.local_int.action_bits & ACTION_STORE_ON_STOP) {
137   - vcpu->arch.local_int.action_bits &= ~ACTION_STORE_ON_STOP;
138   - rc = kvm_s390_vcpu_store_status(vcpu,
139   - KVM_S390_STORE_STATUS_NOADDR);
140   - if (rc >= 0)
141   - rc = -EOPNOTSUPP;
142   - }
143 136  
144 137 if (vcpu->arch.local_int.action_bits & ACTION_RELOADVCPU_ON_STOP) {
145 138 vcpu->arch.local_int.action_bits &= ~ACTION_RELOADVCPU_ON_STOP;
... ... @@ -155,7 +148,18 @@
155 148 rc = -EOPNOTSUPP;
156 149 }
157 150  
158   - spin_unlock_bh(&vcpu->arch.local_int.lock);
  151 + if (vcpu->arch.local_int.action_bits & ACTION_STORE_ON_STOP) {
  152 + vcpu->arch.local_int.action_bits &= ~ACTION_STORE_ON_STOP;
  153 + /* store status must be called unlocked. Since local_int.lock
  154 + * only protects local_int.* and not guest memory we can give
  155 + * up the lock here */
  156 + spin_unlock_bh(&vcpu->arch.local_int.lock);
  157 + rc = kvm_s390_vcpu_store_status(vcpu,
  158 + KVM_S390_STORE_STATUS_NOADDR);
  159 + if (rc >= 0)
  160 + rc = -EOPNOTSUPP;
  161 + } else
  162 + spin_unlock_bh(&vcpu->arch.local_int.lock);
159 163 return rc;
160 164 }
161 165