svn commit: r198036 - in stable/7/sys: . contrib/pf pci

Pyun YongHyeon yongari at FreeBSD.org
Tue Oct 13 17:33:56 UTC 2009


Author: yongari
Date: Tue Oct 13 17:33:55 2009
New Revision: 198036
URL: http://svn.freebsd.org/changeset/base/198036

Log:
  MFC 191344:
    Clear IFF_DRV_OACTIVE flag if one of queued packets was transmitted.
    Previously it used to clear the flag only when the transmit queue
    is empty which may slow down Tx performance.
    While I'm here check whether driver is running and whether we can
    queue more packets in if_start handler. This fixes occasional
    watchdog timeouts.

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/pci/if_xl.c

Modified: stable/7/sys/pci/if_xl.c
==============================================================================
--- stable/7/sys/pci/if_xl.c	Tue Oct 13 16:15:19 2009	(r198035)
+++ stable/7/sys/pci/if_xl.c	Tue Oct 13 17:33:55 2009	(r198036)
@@ -2102,13 +2102,13 @@ xl_txeof(struct xl_softc *sc)
 		m_freem(cur_tx->xl_mbuf);
 		cur_tx->xl_mbuf = NULL;
 		ifp->if_opackets++;
+		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 
 		cur_tx->xl_next = sc->xl_cdata.xl_tx_free;
 		sc->xl_cdata.xl_tx_free = cur_tx;
 	}
 
 	if (sc->xl_cdata.xl_tx_head == NULL) {
-		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 		sc->xl_wdog_timer = 0;
 		sc->xl_cdata.xl_tx_tail = NULL;
 	} else {
@@ -2545,6 +2545,9 @@ xl_start_locked(struct ifnet *ifp)
 
 	XL_LOCK_ASSERT(sc);
 
+	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
+	    IFF_DRV_RUNNING)
+		return;
 	/*
 	 * Check for an available queue slot. If there are none,
 	 * punt.
@@ -2673,7 +2676,8 @@ xl_start_90xB_locked(struct ifnet *ifp)
 
 	XL_LOCK_ASSERT(sc);
 
-	if (ifp->if_drv_flags & IFF_DRV_OACTIVE)
+	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
+	    IFF_DRV_RUNNING)
 		return;
 
 	idx = sc->xl_cdata.xl_tx_prod;


More information about the svn-src-all mailing list