aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Hildenbrand <david@redhat.com>2018-02-06 09:17:43 -0500
committerChristian Borntraeger <borntraeger@de.ibm.com>2018-02-14 08:53:43 -0500
commitbaabee67f4135e3de87bc874929ac50637aacb0d (patch)
tree64aa3bd3118a8857ff818960a69f920548fe20f3
parentcb7485da3ed1ac4ef6c71d4b2b715f8b87f118c8 (diff)
KVM: s390: use switch vs jump table in interrupt.c
Just like for the interception handlers, let's also use a switch-case in our interrupt delivery code. Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20180206141743.24497-1-david@redhat.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
-rw-r--r--arch/s390/kvm/interrupt.c84
1 files changed, 50 insertions, 34 deletions
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index e399495001ca..3f2c49b1a393 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -187,12 +187,6 @@ static int cpu_timer_irq_pending(struct kvm_vcpu *vcpu)
187 return kvm_s390_get_cpu_timer(vcpu) >> 63; 187 return kvm_s390_get_cpu_timer(vcpu) >> 63;
188} 188}
189 189
190static inline int is_ioirq(unsigned long irq_type)
191{
192 return ((irq_type >= IRQ_PEND_IO_ISC_7) &&
193 (irq_type <= IRQ_PEND_IO_ISC_0));
194}
195
196static uint64_t isc_to_isc_bits(int isc) 190static uint64_t isc_to_isc_bits(int isc)
197{ 191{
198 return (0x80 >> isc) << 24; 192 return (0x80 >> isc) << 24;
@@ -1016,24 +1010,6 @@ out:
1016 return rc; 1010 return rc;
1017} 1011}
1018 1012
1019typedef int (*deliver_irq_t)(struct kvm_vcpu *vcpu);
1020
1021static const deliver_irq_t deliver_irq_funcs[] = {
1022 [IRQ_PEND_MCHK_EX] = __deliver_machine_check,
1023 [IRQ_PEND_MCHK_REP] = __deliver_machine_check,
1024 [IRQ_PEND_PROG] = __deliver_prog,
1025 [IRQ_PEND_EXT_EMERGENCY] = __deliver_emergency_signal,
1026 [IRQ_PEND_EXT_EXTERNAL] = __deliver_external_call,
1027 [IRQ_PEND_EXT_CLOCK_COMP] = __deliver_ckc,
1028 [IRQ_PEND_EXT_CPU_TIMER] = __deliver_cpu_timer,
1029 [IRQ_PEND_RESTART] = __deliver_restart,
1030 [IRQ_PEND_SET_PREFIX] = __deliver_set_prefix,
1031 [IRQ_PEND_PFAULT_INIT] = __deliver_pfault_init,
1032 [IRQ_PEND_EXT_SERVICE] = __deliver_service,
1033 [IRQ_PEND_PFAULT_DONE] = __deliver_pfault_done,
1034 [IRQ_PEND_VIRTIO] = __deliver_virtio,
1035};
1036
1037/* Check whether an external call is pending (deliverable or not) */ 1013/* Check whether an external call is pending (deliverable or not) */
1038int kvm_s390_ext_call_pending(struct kvm_vcpu *vcpu) 1014int kvm_s390_ext_call_pending(struct kvm_vcpu *vcpu)
1039{ 1015{
@@ -1197,7 +1173,6 @@ void kvm_s390_clear_local_irqs(struct kvm_vcpu *vcpu)
1197int __must_check kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu) 1173int __must_check kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu)
1198{ 1174{
1199 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; 1175 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
1200 deliver_irq_t func;
1201 int rc = 0; 1176 int rc = 0;
1202 unsigned long irq_type; 1177 unsigned long irq_type;
1203 unsigned long irqs; 1178 unsigned long irqs;
@@ -1217,16 +1192,57 @@ int __must_check kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu)
1217 while ((irqs = deliverable_irqs(vcpu)) && !rc) { 1192 while ((irqs = deliverable_irqs(vcpu)) && !rc) {
1218 /* bits are in the reverse order of interrupt priority */ 1193 /* bits are in the reverse order of interrupt priority */
1219 irq_type = find_last_bit(&irqs, IRQ_PEND_COUNT); 1194 irq_type = find_last_bit(&irqs, IRQ_PEND_COUNT);
1220 if (is_ioirq(irq_type)) { 1195 switch (irq_type) {
1196 case IRQ_PEND_IO_ISC_0:
1197 case IRQ_PEND_IO_ISC_1:
1198 case IRQ_PEND_IO_ISC_2:
1199 case IRQ_PEND_IO_ISC_3:
1200 case IRQ_PEND_IO_ISC_4:
1201 case IRQ_PEND_IO_ISC_5:
1202 case IRQ_PEND_IO_ISC_6:
1203 case IRQ_PEND_IO_ISC_7:
1221 rc = __deliver_io(vcpu, irq_type); 1204 rc = __deliver_io(vcpu, irq_type);
1222 } else { 1205 break;
1223 func = deliver_irq_funcs[irq_type]; 1206 case IRQ_PEND_MCHK_EX:
1224 if (!func) { 1207 case IRQ_PEND_MCHK_REP:
1225 WARN_ON_ONCE(func == NULL); 1208 rc = __deliver_machine_check(vcpu);
1226 clear_bit(irq_type, &li->pending_irqs); 1209 break;
1227 continue; 1210 case IRQ_PEND_PROG:
1228 } 1211 rc = __deliver_prog(vcpu);
1229 rc = func(vcpu); 1212 break;
1213 case IRQ_PEND_EXT_EMERGENCY:
1214 rc = __deliver_emergency_signal(vcpu);
1215 break;
1216 case IRQ_PEND_EXT_EXTERNAL:
1217 rc = __deliver_external_call(vcpu);
1218 break;
1219 case IRQ_PEND_EXT_CLOCK_COMP:
1220 rc = __deliver_ckc(vcpu);
1221 break;
1222 case IRQ_PEND_EXT_CPU_TIMER:
1223 rc = __deliver_cpu_timer(vcpu);
1224 break;
1225 case IRQ_PEND_RESTART:
1226 rc = __deliver_restart(vcpu);
1227 break;
1228 case IRQ_PEND_SET_PREFIX:
1229 rc = __deliver_set_prefix(vcpu);
1230 break;
1231 case IRQ_PEND_PFAULT_INIT:
1232 rc = __deliver_pfault_init(vcpu);
1233 break;
1234 case IRQ_PEND_EXT_SERVICE:
1235 rc = __deliver_service(vcpu);
1236 break;
1237 case IRQ_PEND_PFAULT_DONE:
1238 rc = __deliver_pfault_done(vcpu);
1239 break;
1240 case IRQ_PEND_VIRTIO:
1241 rc = __deliver_virtio(vcpu);
1242 break;
1243 default:
1244 WARN_ONCE(1, "Unknown pending irq type %ld", irq_type);
1245 clear_bit(irq_type, &li->pending_irqs);
1230 } 1246 }
1231 } 1247 }
1232 1248