From 00bc7f0357d082e73699fb561776088e48e53101 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 15 Dec 2016 11:48:12 +0100 Subject: mac80211: merge a number of minstrel/minstrel_ht performance and memory usage improvements Signed-off-by: Felix Fietkau --- ...211-minstrel-remove-cur_prob-from-debugfs.patch | 192 +++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 package/kernel/mac80211/patches/338-mac80211-minstrel-remove-cur_prob-from-debugfs.patch (limited to 'package/kernel/mac80211/patches/338-mac80211-minstrel-remove-cur_prob-from-debugfs.patch') diff --git a/package/kernel/mac80211/patches/338-mac80211-minstrel-remove-cur_prob-from-debugfs.patch b/package/kernel/mac80211/patches/338-mac80211-minstrel-remove-cur_prob-from-debugfs.patch new file mode 100644 index 0000000000..f25b0a8a8c --- /dev/null +++ b/package/kernel/mac80211/patches/338-mac80211-minstrel-remove-cur_prob-from-debugfs.patch @@ -0,0 +1,192 @@ +From: Felix Fietkau +Date: Wed, 14 Dec 2016 20:13:58 +0100 +Subject: [PATCH] mac80211: minstrel: remove cur_prob from debugfs + +This field is redundant, because it is simply last success divided by +last attempt count. Removing it from the rate stats struct saves about +1.2 KiB per HT station. + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/rc80211_minstrel.c ++++ b/net/mac80211/rc80211_minstrel.c +@@ -159,21 +159,23 @@ minstrel_update_rates(struct minstrel_pr + void + minstrel_calc_rate_stats(struct minstrel_rate_stats *mrs) + { ++ unsigned int cur_prob; ++ + if (unlikely(mrs->attempts > 0)) { + mrs->sample_skipped = 0; +- mrs->cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts); ++ cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts); + if (unlikely(!mrs->att_hist)) { +- mrs->prob_ewma = mrs->cur_prob; ++ mrs->prob_ewma = cur_prob; + } else { + /* update exponential weighted moving variance */ + mrs->prob_ewmsd = minstrel_ewmsd(mrs->prob_ewmsd, +- mrs->cur_prob, ++ cur_prob, + mrs->prob_ewma, + EWMA_LEVEL); + + /*update exponential weighted moving avarage */ + mrs->prob_ewma = minstrel_ewma(mrs->prob_ewma, +- mrs->cur_prob, ++ cur_prob, + EWMA_LEVEL); + } + mrs->att_hist += mrs->attempts; +--- a/net/mac80211/rc80211_minstrel.h ++++ b/net/mac80211/rc80211_minstrel.h +@@ -62,10 +62,8 @@ struct minstrel_rate_stats { + u32 att_hist, succ_hist; + + /* statistis of packet delivery probability +- * cur_prob - current prob within last update intervall + * prob_ewma - exponential weighted moving average of prob + * prob_ewmsd - exp. weighted moving standard deviation of prob */ +- unsigned int cur_prob; + unsigned int prob_ewma; + u16 prob_ewmsd; + +--- a/net/mac80211/rc80211_minstrel_debugfs.c ++++ b/net/mac80211/rc80211_minstrel_debugfs.c +@@ -75,7 +75,7 @@ minstrel_stats_open(struct inode *inode, + { + struct minstrel_sta_info *mi = inode->i_private; + struct minstrel_debugfs_info *ms; +- unsigned int i, tp_max, tp_avg, prob, eprob; ++ unsigned int i, tp_max, tp_avg, eprob; + char *p; + + ms = kmalloc(2048, GFP_KERNEL); +@@ -86,9 +86,9 @@ minstrel_stats_open(struct inode *inode, + p = ms->buf; + p += sprintf(p, "\n"); + p += sprintf(p, +- "best __________rate_________ ________statistics________ ________last_______ ______sum-of________\n"); ++ "best __________rate_________ ________statistics________ ____last_____ ______sum-of________\n"); + p += sprintf(p, +- "rate [name idx airtime max_tp] [avg(tp) avg(prob) sd(prob)] [prob.|retry|suc|att] [#success | #attempts]\n"); ++ "rate [name idx airtime max_tp] [avg(tp) avg(prob) sd(prob)] [retry|suc|att] [#success | #attempts]\n"); + + for (i = 0; i < mi->n_rates; i++) { + struct minstrel_rate *mr = &mi->r[i]; +@@ -107,17 +107,15 @@ minstrel_stats_open(struct inode *inode, + + tp_max = minstrel_get_tp_avg(mr, MINSTREL_FRAC(100,100)); + tp_avg = minstrel_get_tp_avg(mr, mrs->prob_ewma); +- prob = MINSTREL_TRUNC(mrs->cur_prob * 1000); + eprob = MINSTREL_TRUNC(mrs->prob_ewma * 1000); + + p += sprintf(p, "%4u.%1u %4u.%1u %3u.%1u %3u.%1u" +- " %3u.%1u %3u %3u %-3u " ++ " %3u %3u %-3u " + "%9llu %-9llu\n", + tp_max / 10, tp_max % 10, + tp_avg / 10, tp_avg % 10, + eprob / 10, eprob % 10, + mrs->prob_ewmsd / 10, mrs->prob_ewmsd % 10, +- prob / 10, prob % 10, + mrs->retry_count, + mrs->last_success, + mrs->last_attempts, +@@ -148,7 +146,7 @@ minstrel_stats_csv_open(struct inode *in + { + struct minstrel_sta_info *mi = inode->i_private; + struct minstrel_debugfs_info *ms; +- unsigned int i, tp_max, tp_avg, prob, eprob; ++ unsigned int i, tp_max, tp_avg, eprob; + char *p; + + ms = kmalloc(2048, GFP_KERNEL); +@@ -175,16 +173,14 @@ minstrel_stats_csv_open(struct inode *in + + tp_max = minstrel_get_tp_avg(mr, MINSTREL_FRAC(100,100)); + tp_avg = minstrel_get_tp_avg(mr, mrs->prob_ewma); +- prob = MINSTREL_TRUNC(mrs->cur_prob * 1000); + eprob = MINSTREL_TRUNC(mrs->prob_ewma * 1000); + +- p += sprintf(p, "%u.%u,%u.%u,%u.%u,%u.%u,%u.%u,%u,%u,%u," ++ p += sprintf(p, "%u.%u,%u.%u,%u.%u,%u.%u,%u,%u,%u," + "%llu,%llu,%d,%d\n", + tp_max / 10, tp_max % 10, + tp_avg / 10, tp_avg % 10, + eprob / 10, eprob % 10, + mrs->prob_ewmsd / 10, mrs->prob_ewmsd % 10, +- prob / 10, prob % 10, + mrs->retry_count, + mrs->last_success, + mrs->last_attempts, +--- a/net/mac80211/rc80211_minstrel_ht_debugfs.c ++++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c +@@ -19,7 +19,7 @@ static char * + minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p) + { + const struct mcs_group *mg; +- unsigned int j, tp_max, tp_avg, prob, eprob, tx_time; ++ unsigned int j, tp_max, tp_avg, eprob, tx_time; + char htmode = '2'; + char gimode = 'L'; + u32 gflags; +@@ -83,17 +83,15 @@ minstrel_ht_stats_dump(struct minstrel_h + + tp_max = minstrel_ht_get_tp_avg(mi, i, j, MINSTREL_FRAC(100, 100)); + tp_avg = minstrel_ht_get_tp_avg(mi, i, j, mrs->prob_ewma); +- prob = MINSTREL_TRUNC(mrs->cur_prob * 1000); + eprob = MINSTREL_TRUNC(mrs->prob_ewma * 1000); + + p += sprintf(p, "%4u.%1u %4u.%1u %3u.%1u %3u.%1u" +- " %3u.%1u %3u %3u %-3u " ++ " %3u %3u %-3u " + "%9llu %-9llu\n", + tp_max / 10, tp_max % 10, + tp_avg / 10, tp_avg % 10, + eprob / 10, eprob % 10, + mrs->prob_ewmsd / 10, mrs->prob_ewmsd % 10, +- prob / 10, prob % 10, + mrs->retry_count, + mrs->last_success, + mrs->last_attempts, +@@ -130,9 +128,9 @@ minstrel_ht_stats_open(struct inode *ino + + p += sprintf(p, "\n"); + p += sprintf(p, +- " best ____________rate__________ ________statistics________ ________last_______ ______sum-of________\n"); ++ " best ____________rate__________ ________statistics________ _____last____ ______sum-of________\n"); + p += sprintf(p, +- "mode guard # rate [name idx airtime max_tp] [avg(tp) avg(prob) sd(prob)] [prob.|retry|suc|att] [#success | #attempts]\n"); ++ "mode guard # rate [name idx airtime max_tp] [avg(tp) avg(prob) sd(prob)] [retry|suc|att] [#success | #attempts]\n"); + + p = minstrel_ht_stats_dump(mi, MINSTREL_CCK_GROUP, p); + for (i = 0; i < MINSTREL_CCK_GROUP; i++) +@@ -165,7 +163,7 @@ static char * + minstrel_ht_stats_csv_dump(struct minstrel_ht_sta *mi, int i, char *p) + { + const struct mcs_group *mg; +- unsigned int j, tp_max, tp_avg, prob, eprob, tx_time; ++ unsigned int j, tp_max, tp_avg, eprob, tx_time; + char htmode = '2'; + char gimode = 'L'; + u32 gflags; +@@ -226,16 +224,14 @@ minstrel_ht_stats_csv_dump(struct minstr + + tp_max = minstrel_ht_get_tp_avg(mi, i, j, MINSTREL_FRAC(100, 100)); + tp_avg = minstrel_ht_get_tp_avg(mi, i, j, mrs->prob_ewma); +- prob = MINSTREL_TRUNC(mrs->cur_prob * 1000); + eprob = MINSTREL_TRUNC(mrs->prob_ewma * 1000); + +- p += sprintf(p, "%u.%u,%u.%u,%u.%u,%u.%u,%u.%u,%u,%u," ++ p += sprintf(p, "%u.%u,%u.%u,%u.%u,%u.%u,%u,%u," + "%u,%llu,%llu,", + tp_max / 10, tp_max % 10, + tp_avg / 10, tp_avg % 10, + eprob / 10, eprob % 10, + mrs->prob_ewmsd / 10, mrs->prob_ewmsd % 10, +- prob / 10, prob % 10, + mrs->retry_count, + mrs->last_success, + mrs->last_attempts, -- cgit v1.2.3