aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/debug.c
diff options
context:
space:
mode:
authorToke Høiland-Jørgensen <toke@toke.dk>2016-11-09 06:31:49 -0500
committerKalle Valo <kvalo@qca.qualcomm.com>2016-11-15 10:00:04 -0500
commit50f08edf98096a68f01ff4566b605a25bf8e42ce (patch)
tree9403ad2aab6dc35e3076974b83328e389f77b3da /drivers/net/wireless/ath/ath9k/debug.c
parent14acebc33e6dc69b31828c64ae069869d9e19f58 (diff)
ath9k: Switch to using mac80211 intermediate software queues.
This switches ath9k over to using the mac80211 intermediate software queueing mechanism for data packets. It removes the queueing inside the driver, except for the retry queue, and instead pulls from mac80211 when a packet is needed. The retry queue is used to store a packet that was pulled but can't be sent immediately. The old code path in ath_tx_start that would queue packets has been removed completely, as has the qlen limit tunables (since there's no longer a queue in the driver to limit). The mac80211 intermediate software queues offer significant latency reductions, and this patch allows ath9k to realise them. The exact gains from this varies with the test scenario, but in an access point scenario we have seen latency reductions ranging from 1/3 to as much as an order of magnitude. We also achieve slightly better aggregation. Median latency (ping) figures with this patch applied at the access point, with two high-rate stations and one low-rate station (HT20 5Ghz), running a Flent rtt_fair_var_up test with one TCP flow and one ping flow going to each station: Fast station Slow station Default pfifo_fast qdisc: 430.4 ms 638.7 ms fq_codel qdisc on iface: 35.5 ms 211.8 ms This patch set: 22.4 ms 38.2 ms Median aggregation sizes over the same test: Default pfifo_fast qdisc: 9.5 pkts 1.9 pkts fq_codel qdisc on iface: 11.2 pkts 1.9 pkts This patch set: 13.9 pkts 1.9 pkts This patch is based on Tim's original patch set, but reworked quite thoroughly. Cc: Tim Shepard <shep@alum.mit.edu> Cc: Felix Fietkau <nbd@nbd.name> Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/debug.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/debug.c14
1 files changed, 1 insertions, 13 deletions
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c
index c56e40ff35e5..89a94dd5f2cb 100644
--- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c
@@ -600,7 +600,6 @@ static int read_file_xmit(struct seq_file *file, void *data)
600 PR("MPDUs XRetried: ", xretries); 600 PR("MPDUs XRetried: ", xretries);
601 PR("Aggregates: ", a_aggr); 601 PR("Aggregates: ", a_aggr);
602 PR("AMPDUs Queued HW:", a_queued_hw); 602 PR("AMPDUs Queued HW:", a_queued_hw);
603 PR("AMPDUs Queued SW:", a_queued_sw);
604 PR("AMPDUs Completed:", a_completed); 603 PR("AMPDUs Completed:", a_completed);
605 PR("AMPDUs Retried: ", a_retries); 604 PR("AMPDUs Retried: ", a_retries);
606 PR("AMPDUs XRetried: ", a_xretries); 605 PR("AMPDUs XRetried: ", a_xretries);
@@ -629,8 +628,7 @@ static void print_queue(struct ath_softc *sc, struct ath_txq *txq,
629 seq_printf(file, "%s: %d ", "qnum", txq->axq_qnum); 628 seq_printf(file, "%s: %d ", "qnum", txq->axq_qnum);
630 seq_printf(file, "%s: %2d ", "qdepth", txq->axq_depth); 629 seq_printf(file, "%s: %2d ", "qdepth", txq->axq_depth);
631 seq_printf(file, "%s: %2d ", "ampdu-depth", txq->axq_ampdu_depth); 630 seq_printf(file, "%s: %2d ", "ampdu-depth", txq->axq_ampdu_depth);
632 seq_printf(file, "%s: %3d ", "pending", txq->pending_frames); 631 seq_printf(file, "%s: %3d\n", "pending", txq->pending_frames);
633 seq_printf(file, "%s: %d\n", "stopped", txq->stopped);
634 632
635 ath_txq_unlock(sc, txq); 633 ath_txq_unlock(sc, txq);
636} 634}
@@ -1208,7 +1206,6 @@ static const char ath9k_gstrings_stats[][ETH_GSTRING_LEN] = {
1208 AMKSTR(d_tx_mpdu_xretries), 1206 AMKSTR(d_tx_mpdu_xretries),
1209 AMKSTR(d_tx_aggregates), 1207 AMKSTR(d_tx_aggregates),
1210 AMKSTR(d_tx_ampdus_queued_hw), 1208 AMKSTR(d_tx_ampdus_queued_hw),
1211 AMKSTR(d_tx_ampdus_queued_sw),
1212 AMKSTR(d_tx_ampdus_completed), 1209 AMKSTR(d_tx_ampdus_completed),
1213 AMKSTR(d_tx_ampdu_retries), 1210 AMKSTR(d_tx_ampdu_retries),
1214 AMKSTR(d_tx_ampdu_xretries), 1211 AMKSTR(d_tx_ampdu_xretries),
@@ -1288,7 +1285,6 @@ void ath9k_get_et_stats(struct ieee80211_hw *hw,
1288 AWDATA(xretries); 1285 AWDATA(xretries);
1289 AWDATA(a_aggr); 1286 AWDATA(a_aggr);
1290 AWDATA(a_queued_hw); 1287 AWDATA(a_queued_hw);
1291 AWDATA(a_queued_sw);
1292 AWDATA(a_completed); 1288 AWDATA(a_completed);
1293 AWDATA(a_retries); 1289 AWDATA(a_retries);
1294 AWDATA(a_xretries); 1290 AWDATA(a_xretries);
@@ -1346,14 +1342,6 @@ int ath9k_init_debug(struct ath_hw *ah)
1346 read_file_xmit); 1342 read_file_xmit);
1347 debugfs_create_devm_seqfile(sc->dev, "queues", sc->debug.debugfs_phy, 1343 debugfs_create_devm_seqfile(sc->dev, "queues", sc->debug.debugfs_phy,
1348 read_file_queues); 1344 read_file_queues);
1349 debugfs_create_u32("qlen_bk", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
1350 &sc->tx.txq_max_pending[IEEE80211_AC_BK]);
1351 debugfs_create_u32("qlen_be", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
1352 &sc->tx.txq_max_pending[IEEE80211_AC_BE]);
1353 debugfs_create_u32("qlen_vi", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
1354 &sc->tx.txq_max_pending[IEEE80211_AC_VI]);
1355 debugfs_create_u32("qlen_vo", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
1356 &sc->tx.txq_max_pending[IEEE80211_AC_VO]);
1357 debugfs_create_devm_seqfile(sc->dev, "misc", sc->debug.debugfs_phy, 1345 debugfs_create_devm_seqfile(sc->dev, "misc", sc->debug.debugfs_phy,
1358 read_file_misc); 1346 read_file_misc);
1359 debugfs_create_devm_seqfile(sc->dev, "reset", sc->debug.debugfs_phy, 1347 debugfs_create_devm_seqfile(sc->dev, "reset", sc->debug.debugfs_phy,