mac80211/minstrel_ht: improve rate selection stability
authorFelix Fietkau <nbd@openwrt.org>
Sat, 16 Mar 2013 16:00:25 +0000 (17:00 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 18 Mar 2013 19:11:58 +0000 (20:11 +0100)
Under load, otherwise stable rates can easily fluctuate because of
collisions. In my tests on a clean channel, the success probability of
the max throughput rate often stays somewhere between 90% and 100% under
load. This can cause some unnecessary switching to lower rates.
This patch improves stability by treating success probability values
between 90% and 100% the same.
In my tests on a 3x3 HT20 link with lots of TCP traffic, it improves the
average throughput by a few mbit/s.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/rc80211_minstrel_ht.c

index 749552bdcfe1eb2d21e1064999dbf08904a54cf6..90499c4217026f5849855be60a6c98688b41c52e 100644 (file)
@@ -202,14 +202,23 @@ minstrel_ht_calc_tp(struct minstrel_ht_sta *mi, int group, int rate)
        struct minstrel_rate_stats *mr;
        unsigned int nsecs = 0;
        unsigned int tp;
+       unsigned int prob;
 
        mr = &mi->groups[group].rates[rate];
+       prob = mr->probability;
 
-       if (mr->probability < MINSTREL_FRAC(1, 10)) {
+       if (prob < MINSTREL_FRAC(1, 10)) {
                mr->cur_tp = 0;
                return;
        }
 
+       /*
+        * For the throughput calculation, limit the probability value to 90% to
+        * account for collision related packet error rate fluctuation
+        */
+       if (prob > MINSTREL_FRAC(9, 10))
+               prob = MINSTREL_FRAC(9, 10);
+
        if (group != MINSTREL_CCK_GROUP)
                nsecs = 1000 * mi->overhead / MINSTREL_TRUNC(mi->avg_ampdu_len);