KVM: s390: kvm_arch_vcpu_runnable already cares about timer interrupts
[deliverable/linux.git] / arch / s390 / kvm / interrupt.c
index 5c2c169395c3ca61fe9e906baab078cf2966dba2..1260f8c18df986202b2e9e5e48c8164bcc4765ac 100644 (file)
@@ -51,11 +51,9 @@ static int psw_mchk_disabled(struct kvm_vcpu *vcpu)
 
 static int psw_interrupts_disabled(struct kvm_vcpu *vcpu)
 {
-       if ((vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PER) ||
-           (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_IO) ||
-           (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_EXT))
-               return 0;
-       return 1;
+       return psw_extint_disabled(vcpu) &&
+              psw_ioint_disabled(vcpu) &&
+              psw_mchk_disabled(vcpu);
 }
 
 static int ckc_interrupts_enabled(struct kvm_vcpu *vcpu)
@@ -109,14 +107,10 @@ static inline u8 int_word_to_isc(u32 int_word)
        return (int_word & 0x38000000) >> 27;
 }
 
-static inline unsigned long pending_floating_irqs(struct kvm_vcpu *vcpu)
-{
-       return vcpu->kvm->arch.float_int.pending_irqs;
-}
-
-static inline unsigned long pending_local_irqs(struct kvm_vcpu *vcpu)
+static inline unsigned long pending_irqs(struct kvm_vcpu *vcpu)
 {
-       return vcpu->arch.local_int.pending_irqs;
+       return vcpu->kvm->arch.float_int.pending_irqs |
+              vcpu->arch.local_int.pending_irqs;
 }
 
 static unsigned long disable_iscs(struct kvm_vcpu *vcpu,
@@ -135,8 +129,7 @@ static unsigned long deliverable_irqs(struct kvm_vcpu *vcpu)
 {
        unsigned long active_mask;
 
-       active_mask = pending_local_irqs(vcpu);
-       active_mask |= pending_floating_irqs(vcpu);
+       active_mask = pending_irqs(vcpu);
        if (!active_mask)
                return 0;
 
@@ -204,7 +197,7 @@ static void __set_cpuflag(struct kvm_vcpu *vcpu, u32 flag)
 
 static void set_intercept_indicators_io(struct kvm_vcpu *vcpu)
 {
-       if (!(pending_floating_irqs(vcpu) & IRQ_PEND_IO_MASK))
+       if (!(pending_irqs(vcpu) & IRQ_PEND_IO_MASK))
                return;
        else if (psw_ioint_disabled(vcpu))
                __set_cpuflag(vcpu, CPUSTAT_IO_INT);
@@ -214,7 +207,7 @@ static void set_intercept_indicators_io(struct kvm_vcpu *vcpu)
 
 static void set_intercept_indicators_ext(struct kvm_vcpu *vcpu)
 {
-       if (!(pending_local_irqs(vcpu) & IRQ_PEND_EXT_MASK))
+       if (!(pending_irqs(vcpu) & IRQ_PEND_EXT_MASK))
                return;
        if (psw_extint_disabled(vcpu))
                __set_cpuflag(vcpu, CPUSTAT_EXT_INT);
@@ -224,7 +217,7 @@ static void set_intercept_indicators_ext(struct kvm_vcpu *vcpu)
 
 static void set_intercept_indicators_mchk(struct kvm_vcpu *vcpu)
 {
-       if (!(pending_local_irqs(vcpu) & IRQ_PEND_MCHK_MASK))
+       if (!(pending_irqs(vcpu) & IRQ_PEND_MCHK_MASK))
                return;
        if (psw_mchk_disabled(vcpu))
                vcpu->arch.sie_block->ictl |= ICTL_LPSW;
@@ -846,7 +839,7 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)
        vcpu->stat.exit_wait_state++;
 
        /* fast path */
-       if (kvm_cpu_has_pending_timer(vcpu) || kvm_arch_vcpu_runnable(vcpu))
+       if (kvm_arch_vcpu_runnable(vcpu))
                return 0;
 
        if (psw_interrupts_disabled(vcpu)) {
@@ -1390,12 +1383,9 @@ static void __floating_irq_kick(struct kvm *kvm, u64 type)
 
 static int __inject_vm(struct kvm *kvm, struct kvm_s390_interrupt_info *inti)
 {
-       struct kvm_s390_float_interrupt *fi;
        u64 type = READ_ONCE(inti->type);
        int rc;
 
-       fi = &kvm->arch.float_int;
-
        switch (type) {
        case KVM_S390_MCHK:
                rc = __inject_float_mchk(kvm, inti);
This page took 0.025534 seconds and 5 git commands to generate.