2007-06-29 19:56:11

by LOL ER

[permalink] [raw]
Subject: Need help making sense of IRQ API

Hello,
I've been trying to make sense of how the kernel (on an i386) calls
__do_IRQ() from do_IRQ() for the past few days to no avail. After
doing some research I found out that do_IRQ() calls the corresponding
"highlevel irq-events handler", this lead me to believe that the
kernel calls __do_IRQ through "desc->handle_irq(irq, desc);" (snippet
from do_IRQ in arch/i386). Looking at the kernel I found a comment
which reads, " * @handle_irq: highlevel irq-events handler [if NULL,
__do_IRQ()]", instinctively I then grepped through the kernel to find
any instances of where handle_IRQ is checked for being NULL. I then
found an inlined function called generic_handle_irq that does just
that. If indeed generic_handle_irq() is the default value of
handle_irq(), why is its datatype not irq_flow_handler_t, and where in
the kernel is it set as the default "highlevel irq-events handler?"
Just to clarify what I mean, the handle_irq member in the irq_desc
struct has its datatype as irq_flow_handler_t, which is a function
pointer that takes 2 arguments, "unsigned int irq, struct irq_desc
*desc", however unsigned generic_handle_irq() takes one argument,
which is just an int representing the IRQ number.
Thank You,
Robert G.


2007-06-29 20:50:14

by Michal Schmidt

[permalink] [raw]
Subject: Re: Need help making sense of IRQ API

LOL ER wrote:
> Hello,
> I've been trying to make sense of how the kernel (on an i386) calls
> __do_IRQ() from do_IRQ() for the past few days to no avail. [...]

Since i386 was switched to the generic-IRQ architecture (see "Linux
generic IRQ handling" in Documentation/Docbook) it does not use __do_IRQ().

common_interrupt (in assembler) calls do_IRQ(), which calls
desc->handle_irq() that is usually one of:
handle_fasteoi_irq()
handle_level_irq()
handle_edge_irq()

Michal