genirq vs. fastack

From: Benjamin Herrenschmidt
Date: Tue May 30 2006 - 21:52:30 EST


Hi Thomas, Ingo !

There is one bit in genirq that I don't get (and doesn't work for me),
it's the "fastack" handler. It does:

out:
if (!(desc->status & IRQ_DISABLED))
desc->chip->ack(irq);
else
desc->chip->mask(irq);

Which doesn't at all match the needs of things like XICS or MPIC and
thus I wonder if it does also make sense for controllers for which you
intend it. It should just be:

desc->chip->end(irq);

Basically, those controllers will have 1) already acke'd the interrupt
by the time you get the vector (the act of getting the vector does the
ack), 2) will use a processor priority mecanism to handle non-reentrency
of an interrupt thus mask/unmask is completely orthogonal to handling of
interrupts and thus there is no need to do anything about mask/unmask in
the handler, 3) all we need is to do an "EOI" (end of interrupt) at the
end of the handling, which is what is done logically in the end()
handler.

Thus this proposed patch:

Index: linux-work/kernel/irq/chip.c
===================================================================
--- linux-work.orig/kernel/irq/chip.c 2006-05-31 11:26:45.000000000 +1000
+++ linux-work/kernel/irq/chip.c 2006-05-31 11:48:19.000000000 +1000
@@ -325,10 +325,7 @@ handle_fastack_irq(unsigned int irq, str
spin_lock(&desc->lock);
desc->status &= ~IRQ_INPROGRESS;
out:
- if (!(desc->status & IRQ_DISABLED))
- desc->chip->ack(irq);
- else
- desc->chip->mask(irq);
+ desc->chip->end(irq);

spin_unlock(&desc->lock);
}


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/