aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/subsys/313-mac80211-improve-AQL-aggregation-estimation-for-low-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/subsys/313-mac80211-improve-AQL-aggregation-estimation-for-low-.patch')
-rw-r--r--package/kernel/mac80211/patches/subsys/313-mac80211-improve-AQL-aggregation-estimation-for-low-.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/subsys/313-mac80211-improve-AQL-aggregation-estimation-for-low-.patch b/package/kernel/mac80211/patches/subsys/313-mac80211-improve-AQL-aggregation-estimation-for-low-.patch
new file mode 100644
index 0000000000..565d9bec43
--- /dev/null
+++ b/package/kernel/mac80211/patches/subsys/313-mac80211-improve-AQL-aggregation-estimation-for-low-.patch
@@ -0,0 +1,66 @@
+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
+@@ -646,27 +646,40 @@ 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;
++ ieee80211_fill_rx_status(&stat, hw, rate, ri, band, len);
++
++ 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)