Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Aug 2011 04:33:49 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r225070 - user/adrian/if_ath_tx/sys/dev/ath
Message-ID:  <201108220433.p7M4XneM033541@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Mon Aug 22 04:33:49 2011
New Revision: 225070
URL: http://svn.freebsd.org/changeset/base/225070

Log:
  Move the TX schedule taskqueue call out of the per-packet path
  and into ath_start(), and call it just once if any packets were
  queued.
  
  Add it back in the ath_tx_raw_xmit() path, so raw packets still
  cause the software TX scheduler to be queued to the ath task
  queue.
  
  This improves TCP performance a bit because of reduced CPU use,
  but UDP still isn't being aggregated.

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

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath.c	Mon Aug 22 03:10:29 2011	(r225069)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath.c	Mon Aug 22 04:33:49 2011	(r225070)
@@ -1908,6 +1908,7 @@ ath_start(struct ifnet *ifp)
 	struct ath_buf *bf;
 	struct mbuf *m, *next;
 	ath_bufhead frags;
+	int tx = 0;
 
 	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || sc->sc_invalid)
 		return;
@@ -1944,6 +1945,7 @@ ath_start(struct ifnet *ifp)
 			goto bad;
 		}
 		ifp->if_opackets++;
+		tx = 1;
 	nextfrag:
 		/*
 		 * Pass the frame to the h/w for transmission.
@@ -1994,6 +1996,13 @@ ath_start(struct ifnet *ifp)
 
 		sc->sc_wd_timer = 5;
 	}
+
+	/*
+	 * Schedule the software TX process to occur
+	 * if we transmitted at least one packet.
+	 */
+	if (tx)
+		ath_tx_sched_proc_sched(sc, NULL);
 }
 
 static int

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Mon Aug 22 03:10:29 2011	(r225069)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Mon Aug 22 04:33:49 2011	(r225070)
@@ -1325,9 +1325,6 @@ ath_tx_start(struct ath_softc *sc, struc
 	} else {
 		/* add to software queue */
 		ath_tx_swq(sc, ni, txq, bf);
-
-		/* Schedule a TX scheduler task call to occur */
-		ath_tx_sched_proc_sched(sc, txq);
 	}
 #else
 	/*
@@ -1552,9 +1549,6 @@ ath_tx_raw_start(struct ath_softc *sc, s
 	else {
 		/* Queue to software queue */
 		ath_tx_swq(sc, ni, sc->sc_ac2q[pri], bf);
-
-		/* Schedule a TX scheduler task call to occur */
-		ath_tx_sched_proc_sched(sc, sc->sc_ac2q[pri]);
 	}
 
 	return 0;
@@ -1617,6 +1611,9 @@ ath_raw_xmit(struct ieee80211_node *ni, 
 	ifp->if_opackets++;
 	sc->sc_stats.ast_tx_raw++;
 
+	/* Schedule a TX scheduler task call to occur */
+	ath_tx_sched_proc_sched(sc, NULL);
+
 	return 0;
 bad2:
 	ATH_TXBUF_LOCK(sc);



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