Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Apr 2009 00:34:31 +0000 (UTC)
From:      Pyun YongHyeon <yongari@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r191344 - head/sys/dev/xl
Message-ID:  <200904210034.n3L0YV9i062814@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: yongari
Date: Tue Apr 21 00:34:31 2009
New Revision: 191344
URL: http://svn.freebsd.org/changeset/base/191344

Log:
  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.
  
  Reported by:	xer < xernet <> hotmail dot it >
  Tested by:	xer < xernet <> hotmail dot it >

Modified:
  head/sys/dev/xl/if_xl.c

Modified: head/sys/dev/xl/if_xl.c
==============================================================================
--- head/sys/dev/xl/if_xl.c	Mon Apr 20 23:25:38 2009	(r191343)
+++ head/sys/dev/xl/if_xl.c	Tue Apr 21 00:34:31 2009	(r191344)
@@ -2097,13 +2097,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 {
@@ -2540,6 +2540,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.
@@ -2668,7 +2671,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;



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