Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Jun 2012 18:48:02 +0000 (UTC)
From:      Maksim Yevmenkin <emax@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r236627 - head/sys/dev/ixgbe
Message-ID:  <201206051848.q55Im2xP037250@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;
 		}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206051848.q55Im2xP037250>