DragonFly users List (threaded) for 2006-11
DragonFly BSD
DragonFly users List (threaded) for 2006-11
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: dual port EM nic wedging under load


From: Matthew Dillon <dillon@xxxxxxxxxxxxxxxxxxxx>
Date: Sun, 26 Nov 2006 08:44:43 -0800 (PST)

: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@xxxxxxxxxxxxx>



[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]