svn commit: r236627 - head/sys/dev/ixgbe
Maksim Yevmenkin
emax at FreeBSD.org
Tue Jun 5 18:48:02 UTC 2012
Author: emax
Date: Tue Jun 5 18:48:02 2012
New Revision: 236627
URL: http://svn.freebsd.org/changeset/base/236627
Log:
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
Modified:
head/sys/dev/ixgbe/ixgbe.c
Modified: head/sys/dev/ixgbe/ixgbe.c
==============================================================================
--- head/sys/dev/ixgbe/ixgbe.c Tue Jun 5 18:19:52 2012 (r236626)
+++ head/sys/dev/ixgbe/ixgbe.c Tue Jun 5 18:48:02 2012 (r236627)
@@ -1368,7 +1368,7 @@ ixgbe_handle_que(void *context, int pend
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;
}
More information about the svn-src-all
mailing list