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