Messages in this thread Patch in this message | | | Subject | genirq vs. fastack | From | Benjamin Herrenschmidt <> | Date | Wed, 31 May 2006 11:52:40 +1000 |
| |
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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |