dual port EM nic wedging under load
Matthew Dillon
dillon at apollo.backplane.com
Sun Nov 26 08:46:39 PST 2006
:We will go into this condition when m_getcl(MB_DONTWAIT). if this
:happened, then
:1) we skipped the rest of the RX ring processing
:2) next_rx_desc_to_check was not updated
:3) RDT was not updated
:
:RX engine would be sitting there, faced with an almost full rx ring
:after the interrupt processing. This should lead to RX overrun and I
:guess hardware may behave strange when this kind of things happened
:(e.g. stall RX engine, which in turn stalls interrupts x_X)
:
:As the output of hw.em0.debug_info=1, reported by Mike, the above
:condition _did_ entered ("em0: Std mbuf cluster failed = 2", it is
:adapter->mbuf_cluster_failed, which is updated if
:em_get_buf():m_getcl() failed) during his benching.
:
:Please review/test following patch:
:http://leaf.dragonflybsd.org/~sephe/em_intr2.diff
:
:Best Regards,
:sephe
:
:--
:Live Free or Die
Nice catch! I reviewed the setting of the RDT and I think it's ok
after all in the no-packets case because there is a conditional before
the loop which explicitly checks for that case. So 'i' will always
be incremented by at least 1. The code is still a bit fragile, but
I don't see any glaring bugs except for the still-possible degenerate
condition if the entire ring is full and the entire ring gets processed
in one shot.
-Matt
Matthew Dillon
<dillon at xxxxxxxxxxxxx>
More information about the Users
mailing list