diff options
-rw-r--r-- | arch/s390/kvm/sigp.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c index 43079a48cc98..fd7fb5c5ef5d 100644 --- a/arch/s390/kvm/sigp.c +++ b/arch/s390/kvm/sigp.c | |||
@@ -136,6 +136,11 @@ static int __inject_sigp_stop(struct kvm_s390_local_interrupt *li, int action) | |||
136 | inti->type = KVM_S390_SIGP_STOP; | 136 | inti->type = KVM_S390_SIGP_STOP; |
137 | 137 | ||
138 | spin_lock_bh(&li->lock); | 138 | spin_lock_bh(&li->lock); |
139 | if (li->action_bits & ACTION_STOP_ON_STOP) { | ||
140 | /* another SIGP STOP is pending */ | ||
141 | rc = SIGP_CC_BUSY; | ||
142 | goto out; | ||
143 | } | ||
139 | if ((atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) { | 144 | if ((atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) { |
140 | kfree(inti); | 145 | kfree(inti); |
141 | if ((action & ACTION_STORE_ON_STOP) != 0) | 146 | if ((action & ACTION_STORE_ON_STOP) != 0) |
@@ -144,8 +149,8 @@ static int __inject_sigp_stop(struct kvm_s390_local_interrupt *li, int action) | |||
144 | } | 149 | } |
145 | list_add_tail(&inti->list, &li->list); | 150 | list_add_tail(&inti->list, &li->list); |
146 | atomic_set(&li->active, 1); | 151 | atomic_set(&li->active, 1); |
147 | atomic_set_mask(CPUSTAT_STOP_INT, li->cpuflags); | ||
148 | li->action_bits |= action; | 152 | li->action_bits |= action; |
153 | atomic_set_mask(CPUSTAT_STOP_INT, li->cpuflags); | ||
149 | if (waitqueue_active(li->wq)) | 154 | if (waitqueue_active(li->wq)) |
150 | wake_up_interruptible(li->wq); | 155 | wake_up_interruptible(li->wq); |
151 | out: | 156 | out: |