aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm
diff options
context:
space:
mode:
authorJens Freimann <jfrei@linux.vnet.ibm.com>2015-04-17 04:21:04 -0400
committerChristian Borntraeger <borntraeger@de.ibm.com>2015-05-08 09:51:15 -0400
commitffeca0ae880055457e56e45fd79cfa28d7160c30 (patch)
treecf4f49a36cc28c34a0d829015e00bf309e2f1af7 /arch/s390/kvm
parent27406cd50cf6653196eea8ebbb15a75596da01ca (diff)
KVM: s390: optimize interrupt handling round trip time
We can avoid checking guest control registers and guest PSW as well as all the masking and calculations on the interrupt masks when no interrupts are pending. Also, the check for IRQ_PEND_COUNT can be removed, because we won't enter the while loop if no interrupts are pending and invalid interrupt types can't be injected. Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Reviewed-by: Dominik Dingel <dingel@linux.vnet.ibm.com> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r--arch/s390/kvm/interrupt.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index 2836b25f63d3..acf4a4e660c0 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -134,6 +134,8 @@ static unsigned long deliverable_irqs(struct kvm_vcpu *vcpu)
134 134
135 active_mask = pending_local_irqs(vcpu); 135 active_mask = pending_local_irqs(vcpu);
136 active_mask |= pending_floating_irqs(vcpu); 136 active_mask |= pending_floating_irqs(vcpu);
137 if (!active_mask)
138 return 0;
137 139
138 if (psw_extint_disabled(vcpu)) 140 if (psw_extint_disabled(vcpu))
139 active_mask &= ~IRQ_PEND_EXT_MASK; 141 active_mask &= ~IRQ_PEND_EXT_MASK;
@@ -941,12 +943,9 @@ int __must_check kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu)
941 if (cpu_timer_irq_pending(vcpu)) 943 if (cpu_timer_irq_pending(vcpu))
942 set_bit(IRQ_PEND_EXT_CPU_TIMER, &li->pending_irqs); 944 set_bit(IRQ_PEND_EXT_CPU_TIMER, &li->pending_irqs);
943 945
944 do { 946 while ((irqs = deliverable_irqs(vcpu)) && !rc) {
945 irqs = deliverable_irqs(vcpu);
946 /* bits are in the order of interrupt priority */ 947 /* bits are in the order of interrupt priority */
947 irq_type = find_first_bit(&irqs, IRQ_PEND_COUNT); 948 irq_type = find_first_bit(&irqs, IRQ_PEND_COUNT);
948 if (irq_type == IRQ_PEND_COUNT)
949 break;
950 if (is_ioirq(irq_type)) { 949 if (is_ioirq(irq_type)) {
951 rc = __deliver_io(vcpu, irq_type); 950 rc = __deliver_io(vcpu, irq_type);
952 } else { 951 } else {
@@ -958,9 +957,7 @@ int __must_check kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu)
958 } 957 }
959 rc = func(vcpu); 958 rc = func(vcpu);
960 } 959 }
961 if (rc) 960 }
962 break;
963 } while (!rc);
964 961
965 set_intercept_indicators(vcpu); 962 set_intercept_indicators(vcpu);
966 963