Why does handle_simple_irq() require IRQ's to be disabled?
Hi,
I am trying to implement/fix interrupt controller functionality in gpio/pca953x.c, and for some reason which I don't understand, I need to disable interrupts with local_irq_disable() before calling generic_handle_irq(). This does not seem right.
If I follow the code of handle_simple_irq(), the handler function setup for this IRQ, I get to handle_irq_event_percpu(), which has a WARN_ONCE(!irqs_disabled(),...
This WARN is triggered, since nobody explicitly disables interrupts. Why?
generic_hanlde_irq() is called from a threaded interrupt handler of the parent of this interrupt controller, and calling local_irq_disable() here seems like a crime. What am I doing wrong?
Best regards,
Signature · 2 lines
David Jander Protonic Holland.
Quoted 12 lines · David Jander
Hi,
I am trying to implement/fix interrupt controller functionality in
gpio/pca953x.c, and for some reason which I don't understand, I need to disable interrupts withlocal_irq_disable()before callinggeneric_handle_irq(). This does not seem right.
If I follow the code ofhandle_simple_irq(), the handler function setup for this IRQ, I get tohandle_irq_event_percpu(), which has a WARN_ONCE(!irqs_disabled(),...
This WARN is triggered, since nobody explicitly disables interrupts. Why?
Quoted 3 lines
generic_hanlde_irq()is called from a threaded interrupt handler of the parent of this interrupt controller, and callinglocal_irq_disable()here seems like a crime. What am I doing wrong?
handle_nested_irq() is your friend.
Hi Thomas,
Quoted 13 lines · On Mon, 6 Jun 2011 18:18:41 +0200 (CEST) Thomas Gleixner <[email protected]>…
Quoted 12 lines · David Jander
Hi,
I am trying to implement/fix interrupt controller functionality in
gpio/pca953x.c, and for some reason which I don't understand, I need to disable interrupts withlocal_irq_disable()before callinggeneric_handle_irq(). This does not seem right.
If I follow the code ofhandle_simple_irq(), the handler function setup for this IRQ, I get tohandle_irq_event_percpu(), which has a WARN_ONCE(!irqs_disabled(),...
This WARN is triggered, since nobody explicitly disables interrupts. Why?
Quoted 5 lines
Quoted 3 lines
generic_hanlde_irq()is called from a threaded interrupt handler of the parent of this interrupt controller, and callinglocal_irq_disable()here seems like a crime. What am I doing wrong?
handle_nested_irq()is your friend.
Thanks! This worked without disabling IRQ's.
One last question, though:
I set up the handler using irq_set_chip_and_handler(irq, ..., handle_simple_irq);
Quoted 1 line
From the interrupt thread, I call
handle_nested_irq(). Is it OK, that in this
case, the defined handler function (handle_simple_irq) is not used? Does this still make sense? Wouldn't calling just irq_set_chip() be enough here (it seems to work correctly)?
Best regards,
Signature · 2 lines
David Jander Protonic Holland.
Quoted 7 lines · David Jander
Quoted 1 line · On Mon, 6 Jun 2011 18:18:41 +0200 (CEST) Thomas Gleixner <[email protected]>…
handle_nested_irq()is your friend.Thanks! This worked without disabling IRQ's.
One last question, though:
Quoted 6 lines
I set up the handler using
irq_set_chip_and_handler(irq, ..., handle_simple_irq);
From the interrupt thread, I callhandle_nested_irq(). Is it OK, that in this case, the defined handler function (handle_simple_irq) is not used? Does this still make sense? Wouldn't calling justirq_set_chip()be enough here (it seems to work correctly)?
It should be enough. Though you should mark the demuxed interrupts with irq_set_nested_thread(irqnr, true). That avoids that you create extra threads for the demuxed interrupts which are never used.
Thanks,
tglx
Dear Thomas,
Quoted 15 lines · On Tue, 7 Jun 2011 10:26:26 +0200 (CEST) Thomas Gleixner <[email protected]>…
Quoted 7 lines · David Jander
Quoted 1 line · On Mon, 6 Jun 2011 18:18:41 +0200 (CEST) Thomas Gleixner <[email protected]>…
handle_nested_irq()is your friend.Thanks! This worked without disabling IRQ's.
One last question, though:Quoted 6 lines
I set up the handler using
irq_set_chip_and_handler(irq, ..., handle_simple_irq);
From the interrupt thread, I callhandle_nested_irq(). Is it OK, that in this case, the defined handler function (handle_simple_irq) is not used? Does this still make sense? Wouldn't calling justirq_set_chip()be enough here (it seems to work correctly)?
Quoted 3 lines
It should be enough. Though you should mark the demuxed interrupts with
irq_set_nested_thread(irqnr, true). That avoids that you create extra threads for the demuxed interrupts which are never used.
Cool! Now the disturbingly big list of kernel threads is gone :-)
Thanks a lot!
Signature · 2 lines
David Jander Protonic Holland.