Before it gets lost in the noise.

Put a bandaid to prevent ixgbe(4) from completely locking up the system
under high load. Our platform has a few CPU cores and a single active
ixgbe(4) port with 4 queues. Under high enough traffic load, at about
7.5GBs and 700,000 packets/sec (outbound), the entire system would
deadlock. What we found was that each CPU was in an endless loop on a
different ix taskqueue thread. The OACTIVE flag had gotten set on each
queue, and the ixgbe_handle_queue() function was continuously rescheduling
itself via the taskqueue_enqueue. Since all CPUs were busy with their
taskqueue threads, the ixgbe_local_timer() function couldn't run to clear
the OACTIVE flag.

Submitted by:	scottl
MFC after:	1 week
This commit is contained in:
Maksim Yevmenkin 2012-06-05 18:48:02 +00:00
parent a4dec862ed
commit cd1fb2e095

View File

@ -1368,7 +1368,7 @@ ixgbe_handle_que(void *context, int pending)
ixgbe_start_locked(txr, ifp);
#endif
IXGBE_TX_UNLOCK(txr);
if (more || (ifp->if_drv_flags & IFF_DRV_OACTIVE)) {
if (more) {
taskqueue_enqueue(que->tq, &que->que_task);
return;
}