vcpu->stat.exit_stop_request++;
 
+       /* delay the stop if any non-stop irq is pending */
+       if (kvm_s390_vcpu_has_irq(vcpu, 1))
+               return 0;
+
        /* avoid races with the injection/SIGP STOP code */
        spin_lock(&li->lock);
        flags = li->irq.stop.flags;
 
        return 0;
 }
 
-int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu)
+int kvm_s390_vcpu_has_irq(struct kvm_vcpu *vcpu, int exclude_stop)
 {
        struct kvm_s390_float_interrupt *fi = vcpu->arch.local_int.float_int;
        struct kvm_s390_interrupt_info  *inti;
        if (!rc && kvm_s390_si_ext_call_pending(vcpu))
                rc = 1;
 
-       if (!rc && kvm_s390_is_stop_irq_pending(vcpu))
+       if (!rc && !exclude_stop && kvm_s390_is_stop_irq_pending(vcpu))
                rc = 1;
 
        return rc;
 
 
 int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
 {
-       return kvm_cpu_has_interrupt(vcpu);
+       return kvm_s390_vcpu_has_irq(vcpu, 0);
 }
 
 void s390_vcpu_block(struct kvm_vcpu *vcpu)
                return 0;
        if (psw_extint_disabled(vcpu))
                return 0;
-       if (kvm_cpu_has_interrupt(vcpu))
+       if (kvm_s390_vcpu_has_irq(vcpu, 0))
                return 0;
        if (!(vcpu->arch.sie_block->gcr[0] & 0x200ul))
                return 0;
 
                        struct kvm_s390_irq *s390irq);
 
 /* implemented in interrupt.c */
-int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu);
+int kvm_s390_vcpu_has_irq(struct kvm_vcpu *vcpu, int exclude_stop);
 int psw_extint_disabled(struct kvm_vcpu *vcpu);
 void kvm_s390_destroy_adapters(struct kvm *kvm);
 int kvm_s390_si_ext_call_pending(struct kvm_vcpu *vcpu);