From 0d8ad9f2af28b329d7bc13865b5d3c77b26b2ca8 Mon Sep 17 00:00:00 2001 From: nbd Date: Sun, 3 Mar 2013 12:05:33 +0000 Subject: mac80211: merge some more minstrel_ht performance improvements git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35848 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/mac80211/patches/300-pending_work.patch | 77 ++++++++++++++++++++----- 1 file changed, 61 insertions(+), 16 deletions(-) diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch index a1bb7023e9..560c3f2662 100644 --- a/package/mac80211/patches/300-pending_work.patch +++ b/package/mac80211/patches/300-pending_work.patch @@ -678,15 +678,7 @@ } /* -@@ -243,6 +246,7 @@ minstrel_ht_update_stats(struct minstrel - struct minstrel_rate_stats *mr; - int cur_prob, cur_prob_tp, cur_tp, cur_tp2; - int group, i, index; -+ int prob_max_streams = 1; - - if (mi->ampdu_packets > 0) { - mi->avg_ampdu_len = minstrel_ewma(mi->avg_ampdu_len, -@@ -308,8 +312,8 @@ minstrel_ht_update_stats(struct minstrel +@@ -308,8 +311,8 @@ minstrel_ht_update_stats(struct minstrel } } @@ -697,7 +689,7 @@ cur_prob = 0; cur_prob_tp = 0; -@@ -320,20 +324,13 @@ minstrel_ht_update_stats(struct minstrel +@@ -320,20 +323,13 @@ minstrel_ht_update_stats(struct minstrel if (!mg->supported) continue; @@ -715,16 +707,16 @@ cur_tp2 = cur_tp; mi->max_tp_rate = mg->max_tp_rate; cur_tp = mr->cur_tp; -+ prob_max_streams = minstrel_mcs_groups[group].streams - 1; ++ mi->max_prob_streams = minstrel_mcs_groups[group].streams - 1; } mr = minstrel_get_ratestats(mi, mg->max_tp_rate2); -@@ -343,6 +340,23 @@ minstrel_ht_update_stats(struct minstrel +@@ -343,6 +339,23 @@ minstrel_ht_update_stats(struct minstrel } } -+ if (prob_max_streams < 1) -+ prob_max_streams = 1; ++ if (mi->max_prob_streams < 1) ++ mi->max_prob_streams = 1; + + for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) { + mg = &mi->groups[group]; @@ -732,7 +724,7 @@ + continue; + mr = minstrel_get_ratestats(mi, mg->max_prob_rate); + if (cur_prob_tp < mr->cur_tp && -+ minstrel_mcs_groups[group].streams <= prob_max_streams) { ++ minstrel_mcs_groups[group].streams <= mi->max_prob_streams) { + mi->max_prob_rate = mg->max_prob_rate; + cur_prob = mr->cur_prob; + cur_prob_tp = mr->cur_tp; @@ -743,7 +735,7 @@ mi->stats_update = jiffies; } -@@ -536,7 +550,7 @@ minstrel_calc_retransmit(struct minstrel +@@ -536,7 +549,7 @@ minstrel_calc_retransmit(struct minstrel mr->retry_updated = true; group = &minstrel_mcs_groups[index / MCS_GROUP_RATES]; @@ -752,3 +744,56 @@ /* Contention time for first 2 tries */ ctime = (t_slot * cw) >> 1; +@@ -616,6 +629,7 @@ minstrel_get_sample_rate(struct minstrel + { + struct minstrel_rate_stats *mr; + struct minstrel_mcs_group_data *mg; ++ unsigned int sample_dur, sample_group; + int sample_idx = 0; + + if (mi->sample_wait > 0) { +@@ -626,11 +640,11 @@ minstrel_get_sample_rate(struct minstrel + if (!mi->sample_tries) + return -1; + +- mi->sample_tries--; + mg = &mi->groups[mi->sample_group]; + sample_idx = sample_table[mg->column][mg->index]; + mr = &mg->rates[sample_idx]; +- sample_idx += mi->sample_group * MCS_GROUP_RATES; ++ sample_group = mi->sample_group; ++ sample_idx += sample_group * MCS_GROUP_RATES; + minstrel_next_sample_idx(mi); + + /* +@@ -651,14 +665,18 @@ minstrel_get_sample_rate(struct minstrel + * Make sure that lower rates get sampled only occasionally, + * if the link is working perfectly. + */ +- if (minstrel_get_duration(sample_idx) > +- minstrel_get_duration(mi->max_tp_rate)) { ++ sample_dur = minstrel_get_duration(sample_idx); ++ if (sample_dur >= minstrel_get_duration(mi->max_tp_rate2) && ++ (mi->max_prob_streams < ++ minstrel_mcs_groups[sample_group].streams || ++ sample_dur >= minstrel_get_duration(mi->max_prob_rate))) { + if (mr->sample_skipped < 20) + 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 +@@ -85,6 +85,7 @@ struct minstrel_ht_sta { + + /* best probability rate */ + unsigned int max_prob_rate; ++ unsigned int max_prob_streams; + + /* time of last status update */ + unsigned long stats_update; -- cgit v1.2.3