diff options
author | David Hildenbrand <david@redhat.com> | 2018-02-06 09:17:43 -0500 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2018-02-14 08:53:43 -0500 |
commit | baabee67f4135e3de87bc874929ac50637aacb0d (patch) | |
tree | 64aa3bd3118a8857ff818960a69f920548fe20f3 | |
parent | cb7485da3ed1ac4ef6c71d4b2b715f8b87f118c8 (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.c | 84 |
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 | ||
190 | static 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 | |||
196 | static uint64_t isc_to_isc_bits(int isc) | 190 | static 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 | ||
1019 | typedef int (*deliver_irq_t)(struct kvm_vcpu *vcpu); | ||
1020 | |||
1021 | static 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) */ |
1038 | int kvm_s390_ext_call_pending(struct kvm_vcpu *vcpu) | 1014 | int 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) | |||
1197 | int __must_check kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu) | 1173 | int __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 | ||