diff mbox series

[9/9] mac80211: rc80211_minstrel: remove variance / stddev calculation

Message ID 20181006173507.7316-9-nbd@nbd.name (mailing list archive)
State Accepted
Delegated to: Johannes Berg
Headers show
Series [1/9] mac80211: minstrel: Enable STBC and LDPC for VHT Rates | expand

Commit Message

Felix Fietkau Oct. 6, 2018, 5:35 p.m. UTC
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@nbd.name>
---
 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(-)

Comments

Dave Taht Oct. 6, 2018, 5:59 p.m. UTC | #1
On Sat, Oct 6, 2018 at 10:37 AM Felix Fietkau <nbd@nbd.name> 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@nbd.name>
> ---
>  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
>
Felix Fietkau Oct. 6, 2018, 6:18 p.m. UTC | #2
On 2018-10-06 19:59, Dave Taht wrote:
> On Sat, Oct 6, 2018 at 10:37 AM Felix Fietkau <nbd@nbd.name> 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@nbd.name>
>> ---
>>  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?
I've done quite a few measurements myself to see if this can be usable
for further rate control improvements or for the upcoming TPC work.
The data this generates simply fluctuates wildly and incoherently based
on the sampling behavior, making it completely useless.
Together with Thomas (who introduced this code), I tried a few times to
fix this, but couldn't find any way to make it coherent and usable.

Thomas and I both agreed that it's better to just remove it until
somebody has a better idea what to do.

Also, this was only used for debugfs statistics, not for any actual rate
control behavior.

- Felix
Dave Taht Oct. 6, 2018, 6:23 p.m. UTC | #3
On Sat, Oct 6, 2018 at 11:18 AM Felix Fietkau <nbd@nbd.name> wrote:
>
> On 2018-10-06 19:59, Dave Taht wrote:
> > On Sat, Oct 6, 2018 at 10:37 AM Felix Fietkau <nbd@nbd.name> 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@nbd.name>
> >> ---
> >>  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?
> I've done quite a few measurements myself to see if this can be usable
> for further rate control improvements or for the upcoming TPC work.
> The data this generates simply fluctuates wildly and incoherently based
> on the sampling behavior, making it completely useless.
> Together with Thomas (who introduced this code), I tried a few times to
> fix this, but couldn't find any way to make it coherent and usable.
>
> Thomas and I both agreed that it's better to just remove it until
> somebody has a better idea what to do.
>
> Also, this was only used for debugfs statistics, not for any actual rate
> control behavior.

OK, thanks. I'm totally delighted to see this patchset otherwise.

> - Felix
diff mbox series

Patch

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
- */
-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,