Jeroen Van den Keybus wrote:
> On my Linux 2.6.23 with latest I-pipe patch (1.10-10), interrupts are
> dispatched twice if they are of the fasteoi type.
> I have the impression that the I-pipe does the eoi() acknowledgement (in
> kernel/irq/chip.c: __ipipe_ack_fasteoi_irq) without first masking off
> the IRQ. As the interrupt line hasn't been cleared at this time, the
> interrupt is immediately reissued. Afterwards (in
> __ipipe_end_fasteoi_irq), unmasking is performed correctly nevertheless.
> If I add 'desc->chip->mask(irq);' before the 'desc->chip->eoi(irq);',
> Linux won't boot anymore; apparently the timer IRQs no longer make it to
> the APIC.
The reason this won't work is because ->mask() will also lock the
interrupt at I-pipe level, i.e. prevent the IRQ from flowing down the
pipeline (see ipipe_lock_irq). What we want here is only a physical
masking, not a physical+logical one, because we still want the incoming
IRQ to be dispatched to the kernel, albeit we ask the IO-APIC not to
send another one until we unmask the source (unmasking without masking
is ok, and simply leads to a no-op).
Xenomai-core mailing list