svn commit: r226357 - user/adrian/if_ath_tx/sys/dev/ath

Adrian Chadd adrian at FreeBSD.org
Fri Oct 14 06:38:45 UTC 2011


Author: adrian
Date: Fri Oct 14 06:38:45 2011
New Revision: 226357
URL: http://svn.freebsd.org/changeset/base/226357

Log:
  Reduce the amount of silly locking overhead which I introduced in a previous
  commit.
  
  This now only grabs the ath lock once when handling the tx queue completion,
  rather than one per queue.

Modified:
  user/adrian/if_ath_tx/sys/dev/ath/if_ath.c

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath.c	Fri Oct 14 03:46:35 2011	(r226356)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath.c	Fri Oct 14 06:38:45 2011	(r226357)
@@ -4630,30 +4630,7 @@ ath_tx_processq(struct ath_softc *sc, st
 	return nacked;
 }
 
-/*
- * This is inefficient - it's going to be a lot better
- * if the ath_tx_proc* functions took a private snapshot
- * of sc_txq_active once, inside the lock, rather than
- * calling it multiple times.
- *
- * So before this makes it into -HEAD, that should be
- * implemented.
- */
-static __inline int
-txqactive(struct ath_softc *sc, int qnum)
-{
-	u_int32_t txqs = 1<<qnum;
-	int r;
-	ATH_LOCK(sc);
-	/*
-	 * This needs to check whether the bit is set, and clear it
-	 * if it is. This is what the HAL functionality did.
-	 */
-	r = sc->sc_txq_active & txqs;
-	sc->sc_txq_active &= ~txqs;
-	ATH_UNLOCK(sc);
-	return (!! r);
-}
+#define	TXQACTIVE(t, q)		( (t) & (1 << (q)))
 
 /*
  * Deferred processing of transmit interrupt; special-cased
@@ -4664,11 +4641,17 @@ ath_tx_proc_q0(void *arg, int npending)
 {
 	struct ath_softc *sc = arg;
 	struct ifnet *ifp = sc->sc_ifp;
+	uint32_t txqs;
+
+	ATH_LOCK(sc);
+	txqs = sc->sc_txq_active;
+	sc->sc_txq_active &= ~txqs;
+	ATH_UNLOCK(sc);
 
-	if (txqactive(sc, 0) && ath_tx_processq(sc, &sc->sc_txq[0]))
+	if (TXQACTIVE(txqs, 0) && ath_tx_processq(sc, &sc->sc_txq[0]))
 		/* XXX why is lastrx updated in tx code? */
 		sc->sc_lastrx = ath_hal_gettsf64(sc->sc_ah);
-	if (txqactive(sc, sc->sc_cabq->axq_qnum))
+	if (TXQACTIVE(txqs, sc->sc_cabq->axq_qnum))
 		ath_tx_processq(sc, sc->sc_cabq);
 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 	sc->sc_wd_timer = 0;
@@ -4689,20 +4672,26 @@ ath_tx_proc_q0123(void *arg, int npendin
 	struct ath_softc *sc = arg;
 	struct ifnet *ifp = sc->sc_ifp;
 	int nacked;
+	uint32_t txqs;
+
+	ATH_LOCK(sc);
+	txqs = sc->sc_txq_active;
+	sc->sc_txq_active &= ~txqs;
+	ATH_UNLOCK(sc);
 
 	/*
 	 * Process each active queue.
 	 */
 	nacked = 0;
-	if (txqactive(sc, 0))
+	if (TXQACTIVE(txqs, 0))
 		nacked += ath_tx_processq(sc, &sc->sc_txq[0]);
-	if (txqactive(sc, 1))
+	if (TXQACTIVE(txqs, 1))
 		nacked += ath_tx_processq(sc, &sc->sc_txq[1]);
-	if (txqactive(sc, 2))
+	if (TXQACTIVE(txqs, 2))
 		nacked += ath_tx_processq(sc, &sc->sc_txq[2]);
-	if (txqactive(sc, 3))
+	if (TXQACTIVE(txqs, 3))
 		nacked += ath_tx_processq(sc, &sc->sc_txq[3]);
-	if (txqactive(sc, sc->sc_cabq->axq_qnum))
+	if (TXQACTIVE(txqs, sc->sc_cabq->axq_qnum))
 		ath_tx_processq(sc, sc->sc_cabq);
 	if (nacked)
 		sc->sc_lastrx = ath_hal_gettsf64(sc->sc_ah);
@@ -4725,13 +4714,19 @@ ath_tx_proc(void *arg, int npending)
 	struct ath_softc *sc = arg;
 	struct ifnet *ifp = sc->sc_ifp;
 	int i, nacked;
+	uint32_t txqs;
+
+	ATH_LOCK(sc);
+	txqs = sc->sc_txq_active;
+	sc->sc_txq_active &= ~txqs;
+	ATH_UNLOCK(sc);
 
 	/*
 	 * Process each active queue.
 	 */
 	nacked = 0;
 	for (i = 0; i < HAL_NUM_TX_QUEUES; i++)
-		if (ATH_TXQ_SETUP(sc, i) && txqactive(sc, i))
+		if (ATH_TXQ_SETUP(sc, i) && TXQACTIVE(txqs, i))
 			nacked += ath_tx_processq(sc, &sc->sc_txq[i]);
 	if (nacked)
 		sc->sc_lastrx = ath_hal_gettsf64(sc->sc_ah);
@@ -4744,6 +4739,7 @@ ath_tx_proc(void *arg, int npending)
 
 	ath_start(ifp);
 }
+#undef	TXQACTIVE
 
 /*
  * Return a buffer to the pool.


More information about the svn-src-user mailing list