On Sat, Oct 6, 2018 at 10:37 AM Felix Fietkau <[email protected]> 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 <[email protected]>
> ---
> 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