svn commit: r239105 - head/sys/dev/e1000

Jack F Vogel jfv at FreeBSD.org
Mon Aug 6 20:44:05 UTC 2012


Author: jfv
Date: Mon Aug  6 20:44:05 2012
New Revision: 239105
URL: http://svn.freebsd.org/changeset/base/239105

Log:
  Correct the mq_start routine to avoid out-of-order
  packet delivery, always enqueue when possible. Also
  correct the DEPLETED test as multiple bits might be
  set.  Thanks to Randall Stewart for the changes!

Modified:
  head/sys/dev/e1000/if_igb.c

Modified: head/sys/dev/e1000/if_igb.c
==============================================================================
--- head/sys/dev/e1000/if_igb.c	Mon Aug  6 20:01:32 2012	(r239104)
+++ head/sys/dev/e1000/if_igb.c	Mon Aug  6 20:44:05 2012	(r239105)
@@ -100,7 +100,7 @@ int	igb_display_debug_stats = 0;
 /*********************************************************************
  *  Driver version:
  *********************************************************************/
-char igb_driver_version[] = "version - 2.3.4";
+char igb_driver_version[] = "version - 2.3.5";
 
 
 /*********************************************************************
@@ -961,7 +961,15 @@ igb_mq_start(struct ifnet *ifp, struct m
 	que = &adapter->queues[i];
 	if (((txr->queue_status & IGB_QUEUE_DEPLETED) == 0) &&
 	    IGB_TX_TRYLOCK(txr)) {
-		err = igb_mq_start_locked(ifp, txr, m);
+		struct mbuf *pm = NULL;
+		/*
+		** Try to queue first to avoid
+		** out-of-order delivery, but 
+		** settle for it if that fails
+		*/
+		if (m && drbr_enqueue(ifp, txr->br, m))
+			pm = m;
+		err = igb_mq_start_locked(ifp, txr, pm);
 		IGB_TX_UNLOCK(txr);
 	} else {
 		err = drbr_enqueue(ifp, txr->br, m);
@@ -981,7 +989,7 @@ igb_mq_start_locked(struct ifnet *ifp, s
 	IGB_TX_LOCK_ASSERT(txr);
 
 	if (((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) ||
-	    (txr->queue_status == IGB_QUEUE_DEPLETED) ||
+	    (txr->queue_status & IGB_QUEUE_DEPLETED) ||
 	    adapter->link_active == 0) {
 		if (m != NULL)
 			err = drbr_enqueue(ifp, txr->br, m);


More information about the svn-src-head mailing list