summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2013-02-11 07:48:26 +0000
committeradrian <adrian@FreeBSD.org>2013-02-11 07:48:26 +0000
commit634ed08a4eaef8d52d9177f0ee4960f2e733580c (patch)
treee00410ab470a3d3a9460b5ddb0b4808b86328c56
parentade04b56f74de25f7285c47b5373fc89dd9a34ee (diff)
downloadFreeBSD-src-634ed08a4eaef8d52d9177f0ee4960f2e733580c.zip
FreeBSD-src-634ed08a4eaef8d52d9177f0ee4960f2e733580c.tar.gz
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)
-rw-r--r--sys/dev/ath/if_ath.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c
index bcb5e8a..7679fd2 100644
--- a/sys/dev/ath/if_ath.c
+++ b/sys/dev/ath/if_ath.c
@@ -4226,7 +4226,9 @@ ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq, int dosched)
/* 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 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);
}
/*
@@ -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
OpenPOWER on IntegriCloud