mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	Completely redesign the rate sampling approach Signed-off-by: Felix Fietkau <nbd@nbd.name>
		
			
				
	
	
		
			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;
 |