aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/subsys/340-mac80211-minstrel_ht-remove-old-ewma-based-rate-aver.patch
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2020-12-29 18:23:29 +0100
committerFelix Fietkau <nbd@nbd.name>2021-01-03 12:56:40 +0100
commit3a12c6679eb184ca2a9a2b1266cc2d41f3f00bad (patch)
tree4c2a02dad4c0ebd8cbd90ad751841f3cedbdfd05 /package/kernel/mac80211/patches/subsys/340-mac80211-minstrel_ht-remove-old-ewma-based-rate-aver.patch
parent55e23f2c02ae95e84613ed7d1cbf8aba557b8682 (diff)
downloadupstream-3a12c6679eb184ca2a9a2b1266cc2d41f3f00bad.tar.gz
upstream-3a12c6679eb184ca2a9a2b1266cc2d41f3f00bad.tar.bz2
upstream-3a12c6679eb184ca2a9a2b1266cc2d41f3f00bad.zip
mac80211: replace legacy minstrel with minstrel_ht, improve rate selection
Legacy minstrel is essentially unmaintained and was showing poor performance Replace it with minstrel_ht and improve rate selection and sampling behavior Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'package/kernel/mac80211/patches/subsys/340-mac80211-minstrel_ht-remove-old-ewma-based-rate-aver.patch')
-rw-r--r--package/kernel/mac80211/patches/subsys/340-mac80211-minstrel_ht-remove-old-ewma-based-rate-aver.patch96
1 files changed, 96 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/subsys/340-mac80211-minstrel_ht-remove-old-ewma-based-rate-aver.patch b/package/kernel/mac80211/patches/subsys/340-mac80211-minstrel_ht-remove-old-ewma-based-rate-aver.patch
new file mode 100644
index 0000000000..9b6a614aa8
--- /dev/null
+++ b/package/kernel/mac80211/patches/subsys/340-mac80211-minstrel_ht-remove-old-ewma-based-rate-aver.patch
@@ -0,0 +1,96 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 26 Dec 2020 14:34:30 +0100
+Subject: [PATCH] mac80211: minstrel_ht: remove old ewma based rate average
+ code
+
+The new noise filter has been the default for a while now with no reported
+downside and significant improvement compared to the old code.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -769,17 +769,8 @@ minstrel_ht_calc_rate_stats(struct minst
+ if (unlikely(mrs->attempts > 0)) {
+ mrs->sample_skipped = 0;
+ cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts);
+- if (mp->new_avg) {
+- minstrel_filter_avg_add(&mrs->prob_avg,
+- &mrs->prob_avg_1, cur_prob);
+- } else if (unlikely(!mrs->att_hist)) {
+- mrs->prob_avg = cur_prob;
+- } else {
+- /*update exponential weighted moving avarage */
+- mrs->prob_avg = minstrel_ewma(mrs->prob_avg,
+- cur_prob,
+- EWMA_LEVEL);
+- }
++ minstrel_filter_avg_add(&mrs->prob_avg,
++ &mrs->prob_avg_1, cur_prob);
+ mrs->att_hist += mrs->attempts;
+ mrs->succ_hist += mrs->success;
+ } else {
+@@ -913,10 +904,8 @@ minstrel_ht_update_stats(struct minstrel
+ /* Try to increase robustness of max_prob_rate*/
+ minstrel_ht_prob_rate_reduce_streams(mi);
+
+- /* try to sample all available rates during each interval */
+- mi->sample_count *= 8;
+- if (mp->new_avg)
+- mi->sample_count /= 2;
++ /* try to sample half of all available rates during each interval */
++ mi->sample_count *= 4;
+
+ if (sample)
+ minstrel_ht_rate_sample_switch(mp, mi);
+@@ -1040,7 +1029,7 @@ minstrel_ht_tx_status(void *priv, struct
+ struct ieee80211_tx_rate *ar = info->status.rates;
+ struct minstrel_rate_stats *rate, *rate2, *rate_sample = NULL;
+ struct minstrel_priv *mp = priv;
+- u32 update_interval = mp->update_interval / 2;
++ u32 update_interval = mp->update_interval;
+ bool last, update = false;
+ bool sample_status = false;
+ int i;
+@@ -1090,9 +1079,8 @@ minstrel_ht_tx_status(void *priv, struct
+
+ switch (mi->sample_mode) {
+ case MINSTREL_SAMPLE_IDLE:
+- if (mp->new_avg &&
+- (mp->hw->max_rates > 1 ||
+- mi->total_packets_cur < SAMPLE_SWITCH_THR))
++ if (mp->hw->max_rates > 1 ||
++ mi->total_packets_cur < SAMPLE_SWITCH_THR)
+ update_interval /= 2;
+ break;
+
+@@ -1832,8 +1820,7 @@ minstrel_ht_alloc(struct ieee80211_hw *h
+ mp->has_mrr = true;
+
+ mp->hw = hw;
+- mp->update_interval = HZ / 10;
+- mp->new_avg = true;
++ mp->update_interval = HZ / 20;
+
+ minstrel_ht_init_cck_rates(mp);
+ for (i = 0; i < ARRAY_SIZE(mp->hw->wiphy->bands); i++)
+@@ -1853,8 +1840,6 @@ static void minstrel_ht_add_debugfs(stru
+ &mp->fixed_rate_idx);
+ debugfs_create_u32("sample_switch", S_IRUGO | S_IWUSR, debugfsdir,
+ &mp->sample_switch);
+- debugfs_create_bool("new_avg", S_IRUGO | S_IWUSR, debugfsdir,
+- &mp->new_avg);
+ }
+ #endif
+
+--- a/net/mac80211/rc80211_minstrel_ht.h
++++ b/net/mac80211/rc80211_minstrel_ht.h
+@@ -60,7 +60,6 @@
+ struct minstrel_priv {
+ struct ieee80211_hw *hw;
+ bool has_mrr;
+- bool new_avg;
+ u32 sample_switch;
+ unsigned int cw_min;
+ unsigned int cw_max;