Commit 9e0d5473e2f0ba2d2fe9dab9408edef3060b710e
Committed by
Avi Kivity
1 parent
851755871c
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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 |