mac80211: add minstrel fixes that fix mt76 issues in legacy mode
Remove deferred sampling code which does not work well with rate tables + probing. Fix tx status handling if the first invalid rate idx is not set to -1 Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
		
							parent
							
								
									bf3158b620
								
							
						
					
					
						commit
						0bb5d39b7a
					
				@ -0,0 +1,96 @@
 | 
			
		||||
From: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
Date: Wed, 11 Nov 2020 19:17:44 +0100
 | 
			
		||||
Subject: [PATCH] mac80211: minstrel: remove deferred sampling code
 | 
			
		||||
 | 
			
		||||
Deferring sampling attempts to the second stage has some bad interactions
 | 
			
		||||
with drivers that process the rate table in hardware and use the probe flag
 | 
			
		||||
to indicate probing packets (e.g. most mt76 drivers). On affected drivers
 | 
			
		||||
it can lead to probing not working at all.
 | 
			
		||||
 | 
			
		||||
If the link conditions turn worse, it might not be such a good idea to
 | 
			
		||||
do a lot of sampling for lower rates in this case.
 | 
			
		||||
 | 
			
		||||
Fix this by simply skipping the sample attempt instead of deferring it,
 | 
			
		||||
but keep the checks that would allow it to be sampled if it was skipped
 | 
			
		||||
too often, but only if it has less than 95% success probability.
 | 
			
		||||
 | 
			
		||||
Also ensure that IEEE80211_TX_CTL_RATE_CTRL_PROBE is set for all probing
 | 
			
		||||
packets.
 | 
			
		||||
 | 
			
		||||
Cc: stable@vger.kernel.org
 | 
			
		||||
Fixes: cccf129f820e ("mac80211: add the 'minstrel' rate control algorithm")
 | 
			
		||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
--- a/net/mac80211/rc80211_minstrel.c
 | 
			
		||||
+++ b/net/mac80211/rc80211_minstrel.c
 | 
			
		||||
@@ -287,12 +287,6 @@ minstrel_tx_status(void *priv, struct ie
 | 
			
		||||
 			mi->r[ndx].stats.success += success;
 | 
			
		||||
 	}
 | 
			
		||||
 
 | 
			
		||||
-	if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) && (i >= 0))
 | 
			
		||||
-		mi->sample_packets++;
 | 
			
		||||
-
 | 
			
		||||
-	if (mi->sample_deferred > 0)
 | 
			
		||||
-		mi->sample_deferred--;
 | 
			
		||||
-
 | 
			
		||||
 	if (time_after(jiffies, mi->last_stats_update +
 | 
			
		||||
 				mp->update_interval / (mp->new_avg ? 2 : 1)))
 | 
			
		||||
 		minstrel_update_stats(mp, mi);
 | 
			
		||||
@@ -367,7 +361,7 @@ minstrel_get_rate(void *priv, struct iee
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
 	delta = (mi->total_packets * sampling_ratio / 100) -
 | 
			
		||||
-			(mi->sample_packets + mi->sample_deferred / 2);
 | 
			
		||||
+			mi->sample_packets;
 | 
			
		||||
 
 | 
			
		||||
 	/* delta < 0: no sampling required */
 | 
			
		||||
 	prev_sample = mi->prev_sample;
 | 
			
		||||
@@ -376,7 +370,6 @@ minstrel_get_rate(void *priv, struct iee
 | 
			
		||||
 		return;
 | 
			
		||||
 
 | 
			
		||||
 	if (mi->total_packets >= 10000) {
 | 
			
		||||
-		mi->sample_deferred = 0;
 | 
			
		||||
 		mi->sample_packets = 0;
 | 
			
		||||
 		mi->total_packets = 0;
 | 
			
		||||
 	} else if (delta > mi->n_rates * 2) {
 | 
			
		||||
@@ -401,19 +394,8 @@ minstrel_get_rate(void *priv, struct iee
 | 
			
		||||
 	 * rate sampling method should be used.
 | 
			
		||||
 	 * Respect such rates that are not sampled for 20 interations.
 | 
			
		||||
 	 */
 | 
			
		||||
-	if (mrr_capable &&
 | 
			
		||||
-	    msr->perfect_tx_time > mr->perfect_tx_time &&
 | 
			
		||||
-	    msr->stats.sample_skipped < 20) {
 | 
			
		||||
-		/* Only use IEEE80211_TX_CTL_RATE_CTRL_PROBE to mark
 | 
			
		||||
-		 * packets that have the sampling rate deferred to the
 | 
			
		||||
-		 * second MRR stage. Increase the sample counter only
 | 
			
		||||
-		 * if the deferred sample rate was actually used.
 | 
			
		||||
-		 * Use the sample_deferred counter to make sure that
 | 
			
		||||
-		 * the sampling is not done in large bursts */
 | 
			
		||||
-		info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
 | 
			
		||||
-		rate++;
 | 
			
		||||
-		mi->sample_deferred++;
 | 
			
		||||
-	} else {
 | 
			
		||||
+	if (msr->perfect_tx_time < mr->perfect_tx_time ||
 | 
			
		||||
+	    msr->stats.sample_skipped >= 20) {
 | 
			
		||||
 		if (!msr->sample_limit)
 | 
			
		||||
 			return;
 | 
			
		||||
 
 | 
			
		||||
@@ -433,6 +415,7 @@ minstrel_get_rate(void *priv, struct iee
 | 
			
		||||
 
 | 
			
		||||
 	rate->idx = mi->r[ndx].rix;
 | 
			
		||||
 	rate->count = minstrel_get_retry_count(&mi->r[ndx], info);
 | 
			
		||||
+	info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
--- a/net/mac80211/rc80211_minstrel.h
 | 
			
		||||
+++ b/net/mac80211/rc80211_minstrel.h
 | 
			
		||||
@@ -126,7 +126,6 @@ struct minstrel_sta_info {
 | 
			
		||||
 	u8 max_prob_rate;
 | 
			
		||||
 	unsigned int total_packets;
 | 
			
		||||
 	unsigned int sample_packets;
 | 
			
		||||
-	int sample_deferred;
 | 
			
		||||
 
 | 
			
		||||
 	unsigned int sample_row;
 | 
			
		||||
 	unsigned int sample_column;
 | 
			
		||||
@ -0,0 +1,26 @@
 | 
			
		||||
From: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
Date: Wed, 11 Nov 2020 19:25:39 +0100
 | 
			
		||||
Subject: [PATCH] mac80211: minstrel: fix tx status processing corner case
 | 
			
		||||
 | 
			
		||||
Some drivers fill the status rate list without setting the rate index after
 | 
			
		||||
the final rate to -1. minstrel_ht already deals with this, but minstrel
 | 
			
		||||
doesn't, which causes it to get stuck at the lowest rate on these drivers.
 | 
			
		||||
 | 
			
		||||
Fix this by checking the count as well.
 | 
			
		||||
 | 
			
		||||
Cc: stable@vger.kernel.org
 | 
			
		||||
Fixes: cccf129f820e ("mac80211: add the 'minstrel' rate control algorithm")
 | 
			
		||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
--- a/net/mac80211/rc80211_minstrel.c
 | 
			
		||||
+++ b/net/mac80211/rc80211_minstrel.c
 | 
			
		||||
@@ -274,7 +274,7 @@ minstrel_tx_status(void *priv, struct ie
 | 
			
		||||
 	success = !!(info->flags & IEEE80211_TX_STAT_ACK);
 | 
			
		||||
 
 | 
			
		||||
 	for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
 | 
			
		||||
-		if (ar[i].idx < 0)
 | 
			
		||||
+		if (ar[i].idx < 0 || !ar[i].count)
 | 
			
		||||
 			break;
 | 
			
		||||
 
 | 
			
		||||
 		ndx = rix_to_ndx(mi, ar[i].idx);
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user