Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 Feb 2013 07:48:26 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r246650 - head/sys/dev/ath
Message-ID:  <201302110748.r1B7mQp4003563@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Mon Feb 11 07:48:26 2013
New Revision: 246650
URL: http://svnweb.freebsd.org/changeset/base/246650

Log:
  Go back to direct-dispatch of the software queue and frame TX paths
  when they're being called from the TX completion handler.
  
  Going (back) through the taskqueue is just adding extra locking and
  latency to packet operations.  This improves performance a little bit
  on most NICs.
  
  It still hasn't restored the original performance of the AR5416 NIC
  but the AR9160, AR9280 and later NICs behave very well with this.
  
  Tested:
  
  * AR5416 STA (still tops out at ~ 70mbit TCP, rather than 150mbit TCP..)
  * AR9160 hostap (good for both TX and RX)
  * AR9280 hostap (good for both TX and RX)

Modified:
  head/sys/dev/ath/if_ath.c

Modified: head/sys/dev/ath/if_ath.c
==============================================================================
--- head/sys/dev/ath/if_ath.c	Mon Feb 11 02:54:24 2013	(r246649)
+++ head/sys/dev/ath/if_ath.c	Mon Feb 11 07:48:26 2013	(r246650)
@@ -4226,7 +4226,9 @@ ath_tx_processq(struct ath_softc *sc, st
 
 	/* Kick the software TXQ scheduler */
 	if (dosched) {
-		ath_tx_swq_kick(sc);
+		ATH_TX_LOCK(sc);
+		ath_txq_sched(sc, txq);
+		ATH_TX_UNLOCK(sc);
 	}
 
 	ATH_KTR(sc, ATH_KTR_TXCOMP, 1,
@@ -4271,11 +4273,11 @@ ath_tx_proc_q0(void *arg, int npending)
 	if (sc->sc_softled)
 		ath_led_event(sc, sc->sc_txrix);
 
+	ath_txq_qrun(ifp);
+
 	ATH_PCU_LOCK(sc);
 	sc->sc_txproc_cnt--;
 	ATH_PCU_UNLOCK(sc);
-
-	ath_tx_kick(sc);
 }
 
 /*
@@ -4324,11 +4326,11 @@ ath_tx_proc_q0123(void *arg, int npendin
 	if (sc->sc_softled)
 		ath_led_event(sc, sc->sc_txrix);
 
+	ath_txq_qrun(ifp);
+
 	ATH_PCU_LOCK(sc);
 	sc->sc_txproc_cnt--;
 	ATH_PCU_UNLOCK(sc);
-
-	ath_tx_kick(sc);
 }
 
 /*
@@ -4369,11 +4371,11 @@ ath_tx_proc(void *arg, int npending)
 	if (sc->sc_softled)
 		ath_led_event(sc, sc->sc_txrix);
 
+	ath_txq_qrun(ifp);
+
 	ATH_PCU_LOCK(sc);
 	sc->sc_txproc_cnt--;
 	ATH_PCU_UNLOCK(sc);
-
-	ath_tx_kick(sc);
 }
 #undef	TXQACTIVE
 



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