diff options
Diffstat (limited to 'arch/s390/kernel/irq.c')
-rw-r--r-- | arch/s390/kernel/irq.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index e30b2dfa8ba0..2429ecd68872 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c | |||
@@ -202,31 +202,27 @@ int unregister_external_interrupt(u16 code, ext_int_handler_t handler) | |||
202 | } | 202 | } |
203 | EXPORT_SYMBOL(unregister_external_interrupt); | 203 | EXPORT_SYMBOL(unregister_external_interrupt); |
204 | 204 | ||
205 | void __irq_entry do_extint(struct pt_regs *regs, unsigned int ext_int_code, | 205 | void __irq_entry do_extint(struct pt_regs *regs, struct ext_code ext_code, |
206 | unsigned int param32, unsigned long param64) | 206 | unsigned int param32, unsigned long param64) |
207 | { | 207 | { |
208 | struct pt_regs *old_regs; | 208 | struct pt_regs *old_regs; |
209 | unsigned short code; | ||
210 | struct ext_int_info *p; | 209 | struct ext_int_info *p; |
211 | int index; | 210 | int index; |
212 | 211 | ||
213 | code = (unsigned short) ext_int_code; | ||
214 | old_regs = set_irq_regs(regs); | 212 | old_regs = set_irq_regs(regs); |
215 | s390_idle_check(regs, S390_lowcore.int_clock, | ||
216 | S390_lowcore.async_enter_timer); | ||
217 | irq_enter(); | 213 | irq_enter(); |
218 | if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) | 214 | if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) |
219 | /* Serve timer interrupts first. */ | 215 | /* Serve timer interrupts first. */ |
220 | clock_comparator_work(); | 216 | clock_comparator_work(); |
221 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; | 217 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; |
222 | if (code != 0x1004) | 218 | if (ext_code.code != 0x1004) |
223 | __get_cpu_var(s390_idle).nohz_delay = 1; | 219 | __get_cpu_var(s390_idle).nohz_delay = 1; |
224 | 220 | ||
225 | index = ext_hash(code); | 221 | index = ext_hash(ext_code.code); |
226 | rcu_read_lock(); | 222 | rcu_read_lock(); |
227 | list_for_each_entry_rcu(p, &ext_int_hash[index], entry) | 223 | list_for_each_entry_rcu(p, &ext_int_hash[index], entry) |
228 | if (likely(p->code == code)) | 224 | if (likely(p->code == ext_code.code)) |
229 | p->handler(ext_int_code, param32, param64); | 225 | p->handler(ext_code, param32, param64); |
230 | rcu_read_unlock(); | 226 | rcu_read_unlock(); |
231 | irq_exit(); | 227 | irq_exit(); |
232 | set_irq_regs(old_regs); | 228 | set_irq_regs(old_regs); |