Skip to contentSkip to conversation

Why does handle_simple_irq() require IRQ's to be disabled?

DISCUSSION David Jander 2 participants 5 messages Jun 6, 2011 – Jun 7, 2011

lore
Share & tools
lore
#0 lore raw

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.
#1 lore raw
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 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?

Quoted 3 lines

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?

handle_nested_irq() is your friend.

#2 lore raw

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 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?

Quoted 5 lines
Quoted 3 lines

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?

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.
#3 lore raw
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 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)?

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

#4 lore raw

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 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)?

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.