[PATCH ath-next v2 0/9] wifi: ath11k: airtime queue limits, fairness and a driver TXQ scheduler
Julius Bairaktaris <[email protected]>
| Newsgroups | org.infradead.lists.ath11k,org.kernel.vger.linux-kernel,org.kernel.vger.linux-wireless |
|---|---|
| Message-ID | <[email protected]> |
ath11k advertises neither NL80211_EXT_FEATURE_AQL nor NL80211_EXT_FEATURE_AIRTIME_FAIRNESS, and every user of either inside mac80211 is gated on the corresponding bit. Both mechanisms are inert on this driver, and the driver keeps no queue of its own, so on a saturated download every queued byte sits in the hardware TX rings, where there is no AQM and no flow separation. Measured on an IPQ8074 access point serving one HE station: saturated TCP downstream, a 20 Hz probe from that station through the same access category, arms interleaved, three pairs each. stock 94.6 Mbit/s 155 ms series, default limit 94.0 Mbit/s 157 ms series, BE aql_txq_limit 500/1000 74.3 Mbit/s 22 ms the same, patch 6 reverted 33.7 Mbit/s 21 ms On stock, mac80211 reports no pending airtime and one frame of FQ-CoDel backlog, and aql_txq_limit has the same effect at either setting, which is none. The series puts the queue back under mac80211's control at no cost where the limit does not bind, and roughly seven times lower latency where it does. Patch 6, the completion-driven scheduling round, is worth 2.2x throughput at identical latency and nothing at the default limit. With two stations on one radio, a 1x1 VHT client and a 2x2 HE client both receiving at once, the slow client takes 65% of the medium on stock for 95 Mbit/s while the fast one gets 35% for 550, and airtime_weight is refused with -EOPNOTSUPP. With the series and the limit binding, the split is 43-45/55-57 at equal weights. No default is changed. The series makes the existing knobs reach the hardware; where the limit sits is left to whoever configures the access point, and the curve is a continuous trade rather than a free win: on this hardware 900/1800 us gives 92 Mbit/s at 127 ms, 550/1100 gives 81 Mbit/s at 31-46 ms, and 500/1000 gives 72 Mbit/s at 19-21 ms. One result is worth stating because it bears on how the limit should be chosen. A sweep of 12000, 6000, 3000, 2000, 1000 and 700 us shows pending airtime tracking the configured limit across the whole range while the latency through the same queue only responds below roughly 2000 us. At 94 Mbit/s, 155 ms of delay is about 1.8 MB in flight while AQL believes 14 ms of airtime is outstanding, so mac80211's estimate runs about an order of magnitude under the occupancy the medium shows. Nothing here changes the estimator; patch 3 exposes the driver-side outstanding MSDU count so that the two can be compared. Patch 1 is a prerequisite for patch 2 rather than an unrelated fix, and the series should not be split on it: the tx completion path it corrects is also the path that returns the AQL charge, so with the feature bit set and that path still calling dev_kfree_skb_any(), pending airtime for an access category rises without bound and no station on the radio is scheduled in it again. Patch 2 advertises AQL. Patch 3 reports the outstanding MSDU count. Patch 4 registers per-station transmit airtime and advertises airtime fairness, which cannot be set without the reporting because the deficit has no estimator fallback. Patch 5 moves the scheduling round into the driver so a second context can drive it, patch 6 drives it from tx completion, and patch 8 ends it when the hardware has no room. Patch 7 registers the hardware's per-PPDU receive duration into the same deficit. Patch 9 gives the tx completion handler a budget, which it did not have and now needs. Patches 1, 2, 4, 6 and 7 carry a measurement. Patch 5 is a prerequisite with no behaviour change beyond a narrower lock, patch 3 adds a counter, patch 8 covers a descriptor-exhaustion path the tested configuration does not reach, and patch 9 bounds a loop that was unbounded. Two notes on overlap and prior art. "wifi: ath11k/ath12k: implement TX flow control" [1] also replaces .wake_tx_queue in ath11k, to stop -ENOMEM under a full TCL ring. Its handler serves only the TXQ it is handed and calls neither ieee80211_txq_schedule_start() nor ieee80211_next_txq(), so it removes the deficit round robin that ieee80211_handle_wake_tx_queue() performs today and forecloses airtime fairness on this driver. This series keeps that scheduling and adds the airtime accounting it needs; patch 8 handles descriptor exhaustion by ending the round on -ENOSPC or -ENOMEM rather than by reading the ring pointer once per frame. An AQL enable with a custom .wake_tx_queue and a tx-completion driven push was proposed for ath11k in 2023 [2]. The design was right. What it was asked for and did not have is the measurement above. A related mac80211 change is posted separately: the airtime queue limit is the same for every station, so it binds before the deficit does and airtime_weight has no effect on the airtime a station receives. Scaling the per-station limit by the weight makes a 4:1 weight produce a 4.5:1 airtime ratio on the pair above, symmetric in both directions. v2: - add the driver TXQ scheduler, the completion-driven round, the receive half of the airtime accounting, the round-ending on descriptor exhaustion and the completion-handler budget (patches 5 to 9) - patch 1: state that it is a prerequisite for patch 2, and why - patch 2: correct the claim that the airtime estimator returns zero before a rate is known; it falls back to a 4 us floor - patch 2: drop the assertion that a driver scheduler is not needed, which patches 5 and 6 refute - patch 4: take the airtime TID from the completion and rate TLVs when the ack/BA status TLV is absent, instead of charging it to best effort - v1: https://lore.kernel.org/all/[email protected]/ [1] https://lore.kernel.org/all/[email protected]/ [2] https://lore.kernel.org/all/[email protected]/ Julius Bairaktaris (9): wifi: ath11k: free tx skbs through ieee80211_free_txskb() wifi: ath11k: enable airtime queue limits wifi: ath11k: report the pending tx MSDU count in soc_dp_stats wifi: ath11k: report tx airtime and enable airtime fairness wifi: ath11k: schedule TXQs from the driver wifi: ath11k: run the TXQ scheduler on tx completion wifi: ath11k: charge received airtime to the station deficit wifi: ath11k: stop a scheduling round when the hardware refuses a frame wifi: ath11k: budget the tx completion handler drivers/net/wireless/ath/ath11k/core.h | 5 ++ drivers/net/wireless/ath/ath11k/debugfs.c | 12 +++++ drivers/net/wireless/ath/ath11k/dp.c | 10 +++- drivers/net/wireless/ath/ath11k/dp_rx.c | 42 ++++++++++++++++ drivers/net/wireless/ath/ath11k/dp_tx.c | 26 ++++++++-- drivers/net/wireless/ath/ath11k/dp_tx.h | 3 +- drivers/net/wireless/ath/ath11k/mac.c | 82 ++++++++++++++++++++++++++++--- drivers/net/wireless/ath/ath11k/mac.h | 1 + 8 files changed, 168 insertions(+), 13 deletions(-) -- 2.51.0