Messages in this thread Patch in this message |  | | | Date | Fri, 31 Jul 2009 00:22:14 +0200 | | From | Jiri Slaby <> | | Subject | Re: [PATCH 1/2] IRQ: fix performance regression on large IA64 systems |
On 07/05/2009 09:26 PM, Thomas Gleixner wrote: > On Fri, 3 Jul 2009, Jiri Slaby wrote: >> Commit b60c1f6ffd88850079ae419aa933ab0eddbd5535 >> (drop note_interrupt() for per-CPU for proper scaling) removed call to >> note_interrupt() in __do_IRQ(). Commit >> d85a60d85ea5b7c597508c1510c88e657773d378 >> (Add IRQF_IRQPOLL flag (common code)) added it again, because it's needed >> for irqpoll. >> >> This patch now introduces a new parameter 'only_fixup' for >> note_interrupt(). This parameter determines two cases: ... > Hmm. I'm not really happy about that patch. It's all about percpu > interrupts which happen to have the same irq number. I think the > correct thing to do is to use the handle_percpu_irq() handler and > modify handle_percpu_irq to call note_interrupt() only when the return > value of the action handler is IRQ_NONE. Otherwise we can leave > everything untouched.
Sorry for the delay, I waited for test results. I have the patch attached and the boot still lasts very long. Do you see any obvious mistake which I don't see? (It's 2.6.27-based, therefore no irq_to_desc.)
Thanks.
--- arch/ia64/kernel/irq_ia64.c | 9 ++++----- kernel/irq/chip.c | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c @@ -624,14 +624,13 @@ static struct irqaction tlb_irqaction = void ia64_native_register_percpu_irq (ia64_vector vec, struct irqaction *action) { - irq_desc_t *desc; - unsigned int irq; + unsigned int irq = vec; + irq_desc_t *desc = irq_desc + irq;
- irq = vec; BUG_ON(bind_irq_vector(irq, vec, CPU_MASK_ALL)); - desc = irq_desc + irq; desc->status |= IRQ_PER_CPU; - desc->chip = &irq_type_ia64_lsapic; + set_irq_chip_and_handler(irq, &irq_type_ia64_lsapic, + &handle_percpu_irq); if (action) setup_irq(irq, action); } --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c @@ -531,7 +531,7 @@ handle_percpu_irq(unsigned int irq, stru desc->chip->ack(irq);
action_ret = handle_IRQ_event(irq, desc->action); - if (!noirqdebug) + if (!noirqdebug && action_ret == IRQ_NONE) note_interrupt(irq, desc, action_ret);
if (desc->chip->eoi)
|  |