mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 01:11:14 +00:00
010682067b
Fixes throughput issues with some drivers (e.g. ath10k) Signed-off-by: Felix Fietkau <nbd@nbd.name>
68 lines
2.1 KiB
Diff
68 lines
2.1 KiB
Diff
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Wed, 12 Aug 2020 17:07:10 +0200
|
|
Subject: [PATCH] mac80211: improve AQL aggregation estimation for low data
|
|
rates
|
|
|
|
Links with low data rates use much smaller aggregates and are much more
|
|
sensitive to latency added by bufferbloat.
|
|
Tune the assumed aggregation length based on the tx rate duration.
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
---
|
|
|
|
--- a/net/mac80211/airtime.c
|
|
+++ b/net/mac80211/airtime.c
|
|
@@ -647,27 +647,41 @@ u32 ieee80211_calc_expected_tx_airtime(s
|
|
if (pubsta) {
|
|
struct sta_info *sta = container_of(pubsta, struct sta_info,
|
|
sta);
|
|
+ struct ieee80211_rx_status stat;
|
|
struct ieee80211_tx_rate *rate = &sta->tx_stats.last_rate;
|
|
struct rate_info *ri = &sta->tx_stats.last_rate_info;
|
|
- u32 airtime;
|
|
+ u32 duration, overhead;
|
|
+ u8 agg_shift;
|
|
|
|
- if (!(rate->flags & (IEEE80211_TX_RC_VHT_MCS |
|
|
- IEEE80211_TX_RC_MCS)))
|
|
- ampdu = false;
|
|
+ if (ieee80211_fill_rx_status(&stat, hw, rate, ri, band, len))
|
|
+ return 0;
|
|
|
|
+ if (stat.encoding == RX_ENC_LEGACY || !ampdu)
|
|
+ return ieee80211_calc_rx_airtime(hw, &stat, len);
|
|
+
|
|
+ duration = ieee80211_get_rate_duration(hw, &stat, &overhead);
|
|
/*
|
|
* Assume that HT/VHT transmission on any AC except VO will
|
|
* use aggregation. Since we don't have reliable reporting
|
|
- * of aggregation length, assume an average of 16.
|
|
+ * of aggregation length, assume an average size based on the
|
|
+ * tx rate.
|
|
* This will not be very accurate, but much better than simply
|
|
- * assuming un-aggregated tx.
|
|
+ * assuming un-aggregated tx in all cases.
|
|
*/
|
|
- airtime = ieee80211_calc_tx_airtime_rate(hw, rate, ri, band,
|
|
- ampdu ? len * 16 : len);
|
|
- if (ampdu)
|
|
- airtime /= 16;
|
|
+ if (duration > 400) /* <= VHT20 MCS2 1S */
|
|
+ agg_shift = 1;
|
|
+ else if (duration > 250) /* <= VHT20 MCS3 1S or MCS1 2S */
|
|
+ agg_shift = 2;
|
|
+ else if (duration > 150) /* <= VHT20 MCS5 1S or MCS3 2S */
|
|
+ agg_shift = 3;
|
|
+ else
|
|
+ agg_shift = 4;
|
|
|
|
- return airtime;
|
|
+ duration *= len;
|
|
+ duration /= AVG_PKT_SIZE;
|
|
+ duration /= 1024;
|
|
+
|
|
+ return duration + (overhead >> agg_shift);
|
|
}
|
|
|
|
if (!conf)
|