On Sat, Oct 6, 2018 at 10:37 AM Felix Fietkau <nbd@xxxxxxxx> wrote: > > When there are few packets (e.g. for sampling attempts), the exponentially > weighted variance is usually vastly overestimated, making the resulting data > essentially useless. As far as I know, there has not been any practical use > for this, so let's not waste any cycles on it. > > Signed-off-by: Felix Fietkau <nbd@xxxxxxxx> > --- > net/mac80211/rc80211_minstrel.c | 6 ----- > net/mac80211/rc80211_minstrel.h | 26 +--------------------- > net/mac80211/rc80211_minstrel_debugfs.c | 14 ++++-------- > net/mac80211/rc80211_minstrel_ht_debugfs.c | 14 ++++-------- > 4 files changed, 9 insertions(+), 51 deletions(-) > > diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c > index dead57ba9eac..a34e9c2ca626 100644 > --- a/net/mac80211/rc80211_minstrel.c > +++ b/net/mac80211/rc80211_minstrel.c > @@ -167,12 +167,6 @@ minstrel_calc_rate_stats(struct minstrel_rate_stats *mrs) > if (unlikely(!mrs->att_hist)) { > mrs->prob_ewma = cur_prob; > } else { > - /* update exponential weighted moving variance */ > - mrs->prob_ewmv = minstrel_ewmv(mrs->prob_ewmv, > - cur_prob, > - mrs->prob_ewma, > - EWMA_LEVEL); > - > /*update exponential weighted moving avarage */ > mrs->prob_ewma = minstrel_ewma(mrs->prob_ewma, > cur_prob, > diff --git a/net/mac80211/rc80211_minstrel.h b/net/mac80211/rc80211_minstrel.h > index 54b2b2c3e10a..23ec953e3a24 100644 > --- a/net/mac80211/rc80211_minstrel.h > +++ b/net/mac80211/rc80211_minstrel.h > @@ -35,19 +35,6 @@ minstrel_ewma(int old, int new, int weight) > return old + incr; > } > > -/* > - * Perform EWMV (Exponentially Weighted Moving Variance) calculation > - */ I worry about this one. where are you getting your proof from? > -static inline int > -minstrel_ewmv(int old_ewmv, int cur_prob, int prob_ewma, int weight) > -{ > - int diff, incr; > - > - diff = cur_prob - prob_ewma; > - incr = (EWMA_DIV - weight) * diff / EWMA_DIV; > - return weight * (old_ewmv + MINSTREL_TRUNC(diff * incr)) / EWMA_DIV; > -} > - > struct minstrel_rate_stats { > /* current / last sampling period attempts/success counters */ > u16 attempts, last_attempts; > @@ -56,11 +43,8 @@ struct minstrel_rate_stats { > /* total attempts/success counters */ > u32 att_hist, succ_hist; > > - /* statistis of packet delivery probability > - * prob_ewma - exponential weighted moving average of prob > - * prob_ewmsd - exp. weighted moving standard deviation of prob */ > + /* prob_ewma - exponential weighted moving average of prob */ > u16 prob_ewma; > - u16 prob_ewmv; > > /* maximum retry counts */ > u8 retry_count; > @@ -140,14 +124,6 @@ struct minstrel_debugfs_info { > char buf[]; > }; > > -/* Get EWMSD (Exponentially Weighted Moving Standard Deviation) * 10 */ > -static inline int > -minstrel_get_ewmsd10(struct minstrel_rate_stats *mrs) > -{ > - unsigned int ewmv = mrs->prob_ewmv; > - return int_sqrt(MINSTREL_TRUNC(ewmv * 1000 * 1000)); > -} > - > extern const struct rate_control_ops mac80211_minstrel; > void minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir); > > diff --git a/net/mac80211/rc80211_minstrel_debugfs.c b/net/mac80211/rc80211_minstrel_debugfs.c > index 698a668b5316..c8afd85b51a0 100644 > --- a/net/mac80211/rc80211_minstrel_debugfs.c > +++ b/net/mac80211/rc80211_minstrel_debugfs.c > @@ -70,14 +70,13 @@ minstrel_stats_open(struct inode *inode, struct file *file) > 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)] [retry|suc|att] [#success | #attempts]\n"); > + "rate [name idx airtime max_tp] [avg(tp) avg(prob)] [retry|suc|att] [#success | #attempts]\n"); > > for (i = 0; i < mi->n_rates; i++) { > struct minstrel_rate *mr = &mi->r[i]; > struct minstrel_rate_stats *mrs = &mi->r[i].stats; > - unsigned int prob_ewmsd; > > *(p++) = (i == mi->max_tp_rate[0]) ? 'A' : ' '; > *(p++) = (i == mi->max_tp_rate[1]) ? 'B' : ' '; > @@ -93,15 +92,13 @@ minstrel_stats_open(struct inode *inode, struct file *file) > tp_max = minstrel_get_tp_avg(mr, MINSTREL_FRAC(100,100)); > tp_avg = minstrel_get_tp_avg(mr, mrs->prob_ewma); > eprob = MINSTREL_TRUNC(mrs->prob_ewma * 1000); > - prob_ewmsd = minstrel_get_ewmsd10(mrs); > > - p += sprintf(p, "%4u.%1u %4u.%1u %3u.%1u %3u.%1u" > + p += sprintf(p, "%4u.%1u %4u.%1u %3u.%1u" > " %3u %3u %-3u " > "%9llu %-9llu\n", > tp_max / 10, tp_max % 10, > tp_avg / 10, tp_avg % 10, > eprob / 10, eprob % 10, > - prob_ewmsd / 10, prob_ewmsd % 10, > mrs->retry_count, > mrs->last_success, > mrs->last_attempts, > @@ -137,7 +134,6 @@ minstrel_stats_csv_open(struct inode *inode, struct file *file) > for (i = 0; i < mi->n_rates; i++) { > struct minstrel_rate *mr = &mi->r[i]; > struct minstrel_rate_stats *mrs = &mi->r[i].stats; > - unsigned int prob_ewmsd; > > p += sprintf(p, "%s" ,((i == mi->max_tp_rate[0]) ? "A" : "")); > p += sprintf(p, "%s" ,((i == mi->max_tp_rate[1]) ? "B" : "")); > @@ -153,14 +149,12 @@ minstrel_stats_csv_open(struct inode *inode, struct file *file) > tp_max = minstrel_get_tp_avg(mr, MINSTREL_FRAC(100,100)); > tp_avg = minstrel_get_tp_avg(mr, mrs->prob_ewma); > eprob = MINSTREL_TRUNC(mrs->prob_ewma * 1000); > - prob_ewmsd = minstrel_get_ewmsd10(mrs); > > - p += sprintf(p, "%u.%u,%u.%u,%u.%u,%u.%u,%u,%u,%u," > + p += sprintf(p, "%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, > - prob_ewmsd / 10, prob_ewmsd % 10, > mrs->retry_count, > mrs->last_success, > mrs->last_attempts, > diff --git a/net/mac80211/rc80211_minstrel_ht_debugfs.c b/net/mac80211/rc80211_minstrel_ht_debugfs.c > index 8065da2cf0f1..57820a5f2c16 100644 > --- a/net/mac80211/rc80211_minstrel_ht_debugfs.c > +++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c > @@ -57,7 +57,6 @@ minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p) > struct minstrel_rate_stats *mrs = &mi->groups[i].rates[j]; > static const int bitrates[4] = { 10, 20, 55, 110 }; > int idx = i * MCS_GROUP_RATES + j; > - unsigned int prob_ewmsd; > unsigned int duration; > > if (!(mi->supported[i] & BIT(j))) > @@ -104,15 +103,13 @@ minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p) > 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); > eprob = MINSTREL_TRUNC(mrs->prob_ewma * 1000); > - prob_ewmsd = minstrel_get_ewmsd10(mrs); > > - p += sprintf(p, "%4u.%1u %4u.%1u %3u.%1u %3u.%1u" > + p += sprintf(p, "%4u.%1u %4u.%1u %3u.%1u" > " %3u %3u %-3u " > "%9llu %-9llu\n", > tp_max / 10, tp_max % 10, > tp_avg / 10, tp_avg % 10, > eprob / 10, eprob % 10, > - prob_ewmsd / 10, prob_ewmsd % 10, > mrs->retry_count, > mrs->last_success, > mrs->last_attempts, > @@ -149,9 +146,9 @@ minstrel_ht_stats_open(struct inode *inode, struct file *file) > > 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)] [retry|suc|att] [#success | #attempts]\n"); > + "mode guard # rate [name idx airtime max_tp] [avg(tp) avg(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++) > @@ -206,7 +203,6 @@ minstrel_ht_stats_csv_dump(struct minstrel_ht_sta *mi, int i, char *p) > struct minstrel_rate_stats *mrs = &mi->groups[i].rates[j]; > static const int bitrates[4] = { 10, 20, 55, 110 }; > int idx = i * MCS_GROUP_RATES + j; > - unsigned int prob_ewmsd; > unsigned int duration; > > if (!(mi->supported[i] & BIT(j))) > @@ -251,14 +247,12 @@ minstrel_ht_stats_csv_dump(struct minstrel_ht_sta *mi, int i, char *p) > 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); > eprob = MINSTREL_TRUNC(mrs->prob_ewma * 1000); > - prob_ewmsd = minstrel_get_ewmsd10(mrs); > > - p += sprintf(p, "%u.%u,%u.%u,%u.%u,%u.%u,%u,%u," > + p += sprintf(p, "%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, > - prob_ewmsd / 10, prob_ewmsd % 10, > mrs->retry_count, > mrs->last_success, > mrs->last_attempts, > -- > 2.17.0 > -- Dave Täht CTO, TekLibre, LLC http://www.teklibre.com Tel: 1-831-205-9740