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;
 | 
						|
 
 | 
						|
 	if (mi->supported[MINSTREL_CCK_GROUP])
 | 
						|
@@ -882,6 +878,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])
 | 
						|
@@ -896,7 +893,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;
 | 
						|
 
 | 
						|
@@ -905,6 +902,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)
 | 
						|
@@ -1469,13 +1471,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;
 |