aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/kernel/irq.c')
-rw-r--r--arch/s390/kernel/irq.c14
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}
203EXPORT_SYMBOL(unregister_external_interrupt); 203EXPORT_SYMBOL(unregister_external_interrupt);
204 204
205void __irq_entry do_extint(struct pt_regs *regs, unsigned int ext_int_code, 205void __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);