mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 15:02:32 +00:00
103 lines
3.1 KiB
Diff
103 lines
3.1 KiB
Diff
|
From: Felix Fietkau <nbd@nbd.name>
|
||
|
Date: Fri, 22 Jan 2021 19:24:59 +0100
|
||
|
Subject: [PATCH] mac80211: minstrel_ht: reduce the need to sample slower
|
||
|
rates
|
||
|
|
||
|
In order to more gracefully be able to fall back to lower rates without too
|
||
|
much throughput fluctuations, initialize all untested rates below tested ones
|
||
|
to the maximum probabilty of higher rates.
|
||
|
Usually this leads to untested lower rates getting initialized with a
|
||
|
probability value of 100%, making them better candidates for fallback without
|
||
|
having to rely on random probing
|
||
|
|
||
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||
|
---
|
||
|
|
||
|
--- a/net/mac80211/rc80211_minstrel_ht.c
|
||
|
+++ b/net/mac80211/rc80211_minstrel_ht.c
|
||
|
@@ -791,14 +791,11 @@ minstrel_ht_calc_rate_stats(struct minst
|
||
|
unsigned int cur_prob;
|
||
|
|
||
|
if (unlikely(mrs->attempts > 0)) {
|
||
|
- mrs->sample_skipped = 0;
|
||
|
cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts);
|
||
|
minstrel_filter_avg_add(&mrs->prob_avg,
|
||
|
&mrs->prob_avg_1, cur_prob);
|
||
|
mrs->att_hist += mrs->attempts;
|
||
|
mrs->succ_hist += mrs->success;
|
||
|
- } else {
|
||
|
- mrs->sample_skipped++;
|
||
|
}
|
||
|
|
||
|
mrs->last_success = mrs->success;
|
||
|
@@ -851,7 +848,6 @@ minstrel_ht_update_stats(struct minstrel
|
||
|
mi->ampdu_packets = 0;
|
||
|
}
|
||
|
|
||
|
- mi->sample_slow = 0;
|
||
|
mi->sample_count = 0;
|
||
|
|
||
|
memset(tmp_mcs_tp_rate, 0, sizeof(tmp_mcs_tp_rate));
|
||
|
@@ -883,6 +879,7 @@ minstrel_ht_update_stats(struct minstrel
|
||
|
/* Find best rate sets within all MCS groups*/
|
||
|
for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
|
||
|
u16 *tp_rate = tmp_mcs_tp_rate;
|
||
|
+ u16 last_prob = 0;
|
||
|
|
||
|
mg = &mi->groups[group];
|
||
|
if (!mi->supported[group])
|
||
|
@@ -897,7 +894,7 @@ minstrel_ht_update_stats(struct minstrel
|
||
|
if (group == MINSTREL_CCK_GROUP && ht_supported)
|
||
|
tp_rate = tmp_legacy_tp_rate;
|
||
|
|
||
|
- for (i = 0; i < MCS_GROUP_RATES; i++) {
|
||
|
+ for (i = MCS_GROUP_RATES - 1; i >= 0; i--) {
|
||
|
if (!(mi->supported[group] & BIT(i)))
|
||
|
continue;
|
||
|
|
||
|
@@ -906,6 +903,11 @@ minstrel_ht_update_stats(struct minstrel
|
||
|
mrs = &mg->rates[i];
|
||
|
mrs->retry_updated = false;
|
||
|
minstrel_ht_calc_rate_stats(mp, mrs);
|
||
|
+
|
||
|
+ if (mrs->att_hist)
|
||
|
+ last_prob = max(last_prob, mrs->prob_avg);
|
||
|
+ else
|
||
|
+ mrs->prob_avg = max(last_prob, mrs->prob_avg);
|
||
|
cur_prob = mrs->prob_avg;
|
||
|
|
||
|
if (minstrel_ht_get_tp_avg(mi, group, i, cur_prob) == 0)
|
||
|
@@ -1470,13 +1472,9 @@ minstrel_get_sample_rate(struct minstrel
|
||
|
if (sample_dur >= minstrel_get_duration(tp_rate2) &&
|
||
|
(cur_max_tp_streams - 1 <
|
||
|
minstrel_mcs_groups[sample_group].streams ||
|
||
|
- sample_dur >= minstrel_get_duration(mi->max_prob_rate))) {
|
||
|
- if (mrs->sample_skipped < 20)
|
||
|
+ sample_dur >= minstrel_get_duration(mi->max_prob_rate)))
|
||
|
return -1;
|
||
|
|
||
|
- if (mi->sample_slow++ > 2)
|
||
|
- return -1;
|
||
|
- }
|
||
|
mi->sample_tries--;
|
||
|
|
||
|
return sample_idx;
|
||
|
--- a/net/mac80211/rc80211_minstrel_ht.h
|
||
|
+++ b/net/mac80211/rc80211_minstrel_ht.h
|
||
|
@@ -123,7 +123,6 @@ struct minstrel_rate_stats {
|
||
|
u8 retry_count;
|
||
|
u8 retry_count_rtscts;
|
||
|
|
||
|
- u8 sample_skipped;
|
||
|
bool retry_updated;
|
||
|
};
|
||
|
|
||
|
@@ -179,7 +178,6 @@ struct minstrel_ht_sta {
|
||
|
u8 sample_wait;
|
||
|
u8 sample_tries;
|
||
|
u8 sample_count;
|
||
|
- u8 sample_slow;
|
||
|
|
||
|
enum minstrel_sample_mode sample_mode;
|
||
|
u16 sample_rate;
|