[pxe] Avoid potential interrupt storms when using shared interrupts
authorMichael Brown <mcb30@etherboot.org>
Tue, 23 Mar 2010 00:58:52 +0000 (00:58 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 23 Mar 2010 01:39:52 +0000 (01:39 +0000)
commit9acf442c2042f70408f0fb5fd083898e399001bd
tree6e763d1bc6f7573a96f61cc04be879708be9ef4e
parent4a7648bd3d811c10f272608cf5a64ab5eb2cd728
[pxe] Avoid potential interrupt storms when using shared interrupts

Current gPXE code always returns "OURS" in response to
PXENV_UNDI_ISR:START.  This is harmless for non-shared interrupt
lines, and avoids the complexity of trying to determine whether or not
we really did cause the interrupt.  (This is a non-trivial
determination; some drivers don't have interrupt support and hook the
system timer interrupt instead, for example.)

A problem occurs when we have a shared interrupt line, the other
device asserts an interrupt, and the controlling ISR does not chain to
the other device's ISR when we return "OURS".  Under these
circumstances, the other device's ISR never executes, and so the
interrupt remains asserted, causing an interrupt storm.

Work around this by returning "OURS" if and only if our net device's
interrupt is currently recorded as being enabled.  Since we always
disable interrupts as a result of a call to PXENV_UNDI_ISR:START, this
guarantees that we will eventually (on the second call) return "NOT
OURS", allowing the other ISR to be called.  Under normal operation,
including a non-shared interrupt situation, this change will make no
difference since PXENV_UNDI_ISR:START would be called only when
interrupts were enabled anyway.

Signed-off-by: Michael Brown <mcb30@etherboot.org>
src/arch/i386/interface/pxe/pxe_undi.c