diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2005-11-08 21:28:33 -0500 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2005-11-08 21:28:33 -0500 |
commit | b709c0832824da20a32a3119911b9f0cf6970452 (patch) | |
tree | 1bf6e461f754aee5dbd870072080b5e5f2c1ee8c /arch/ppc64/kernel/irq.c | |
parent | 66ba135c5a398df5c3a4b43d84d9df80cbc87c61 (diff) |
ppc64: move stack switching up in interrupt processing
This will make the ppc64 multiplatform irq handling more like
the generic handling.
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Diffstat (limited to 'arch/ppc64/kernel/irq.c')
-rw-r--r-- | arch/ppc64/kernel/irq.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/arch/ppc64/kernel/irq.c b/arch/ppc64/kernel/irq.c index 87474584033f..b61497d5be28 100644 --- a/arch/ppc64/kernel/irq.c +++ b/arch/ppc64/kernel/irq.c | |||
@@ -157,9 +157,6 @@ void ppc_irq_dispatch_handler(struct pt_regs *regs, int irq) | |||
157 | int cpu = smp_processor_id(); | 157 | int cpu = smp_processor_id(); |
158 | irq_desc_t *desc = get_irq_desc(irq); | 158 | irq_desc_t *desc = get_irq_desc(irq); |
159 | irqreturn_t action_ret; | 159 | irqreturn_t action_ret; |
160 | #ifdef CONFIG_IRQSTACKS | ||
161 | struct thread_info *curtp, *irqtp; | ||
162 | #endif | ||
163 | 160 | ||
164 | kstat_cpu(cpu).irqs[irq]++; | 161 | kstat_cpu(cpu).irqs[irq]++; |
165 | 162 | ||
@@ -227,20 +224,7 @@ void ppc_irq_dispatch_handler(struct pt_regs *regs, int irq) | |||
227 | for (;;) { | 224 | for (;;) { |
228 | spin_unlock(&desc->lock); | 225 | spin_unlock(&desc->lock); |
229 | 226 | ||
230 | #ifdef CONFIG_IRQSTACKS | 227 | action_ret = handle_IRQ_event(irq, regs, action); |
231 | /* Switch to the irq stack to handle this */ | ||
232 | curtp = current_thread_info(); | ||
233 | irqtp = hardirq_ctx[smp_processor_id()]; | ||
234 | if (curtp != irqtp) { | ||
235 | irqtp->task = curtp->task; | ||
236 | irqtp->flags = 0; | ||
237 | action_ret = call_handle_IRQ_event(irq, regs, action, irqtp); | ||
238 | irqtp->task = NULL; | ||
239 | if (irqtp->flags) | ||
240 | set_bits(irqtp->flags, &curtp->flags); | ||
241 | } else | ||
242 | #endif | ||
243 | action_ret = handle_IRQ_event(irq, regs, action); | ||
244 | 228 | ||
245 | spin_lock(&desc->lock); | 229 | spin_lock(&desc->lock); |
246 | if (!noirqdebug) | 230 | if (!noirqdebug) |
@@ -310,6 +294,9 @@ void do_IRQ(struct pt_regs *regs) | |||
310 | void do_IRQ(struct pt_regs *regs) | 294 | void do_IRQ(struct pt_regs *regs) |
311 | { | 295 | { |
312 | int irq; | 296 | int irq; |
297 | #ifdef CONFIG_IRQSTACKS | ||
298 | struct thread_info *curtp, *irqtp; | ||
299 | #endif | ||
313 | 300 | ||
314 | irq_enter(); | 301 | irq_enter(); |
315 | 302 | ||
@@ -330,9 +317,22 @@ void do_IRQ(struct pt_regs *regs) | |||
330 | 317 | ||
331 | irq = ppc_md.get_irq(regs); | 318 | irq = ppc_md.get_irq(regs); |
332 | 319 | ||
333 | if (irq >= 0) | 320 | if (irq >= 0) { |
334 | ppc_irq_dispatch_handler(regs, irq); | 321 | #ifdef CONFIG_IRQSTACKS |
335 | else | 322 | /* Switch to the irq stack to handle this */ |
323 | curtp = current_thread_info(); | ||
324 | irqtp = hardirq_ctx[smp_processor_id()]; | ||
325 | if (curtp != irqtp) { | ||
326 | irqtp->task = curtp->task; | ||
327 | irqtp->flags = 0; | ||
328 | call_ppc_irq_dispatch_handler(regs, irq, irqtp); | ||
329 | irqtp->task = NULL; | ||
330 | if (irqtp->flags) | ||
331 | set_bits(irqtp->flags, &curtp->flags); | ||
332 | } else | ||
333 | #endif | ||
334 | ppc_irq_dispatch_handler(regs, irq); | ||
335 | } else | ||
336 | /* That's not SMP safe ... but who cares ? */ | 336 | /* That's not SMP safe ... but who cares ? */ |
337 | ppc_spurious_interrupts++; | 337 | ppc_spurious_interrupts++; |
338 | 338 | ||