mac80211: add max lossless throughput per rate
This patch adds the new statistic "maximum possible lossless throughput" to Minstrels and Minstrel-HTs rc_stats (in debugfs). This enables comprehensive comparison between current per-rate throughput and max. achievable per-rate throughput. Signed-off-by: Thomas Huehn <thomas@net.t-labs.tu-berlin.de> Acked-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:

committed by
Johannes Berg

parent
6a27b2c40b
commit
50e55a8ea7
@@ -75,7 +75,7 @@ minstrel_stats_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct minstrel_sta_info *mi = inode->i_private;
|
||||
struct minstrel_debugfs_info *ms;
|
||||
unsigned int i, tp_avg, prob, eprob;
|
||||
unsigned int i, tp_max, tp_avg, prob, eprob;
|
||||
char *p;
|
||||
|
||||
ms = kmalloc(2048, GFP_KERNEL);
|
||||
@@ -85,9 +85,9 @@ minstrel_stats_open(struct inode *inode, struct file *file)
|
||||
file->private_data = ms;
|
||||
p = ms->buf;
|
||||
p += sprintf(p, "\n");
|
||||
p += sprintf(p, "best _______rate_____ __statistics__ "
|
||||
p += sprintf(p, "best __________rate_________ __statistics__ "
|
||||
"________last_______ ______sum-of________\n");
|
||||
p += sprintf(p, "rate [name idx airtime] [ ø(tp) ø(prob)] "
|
||||
p += sprintf(p, "rate [name idx airtime max_tp] [ ø(tp) ø(prob)] "
|
||||
"[prob.|retry|suc|att] [#success | #attempts]\n");
|
||||
|
||||
for (i = 0; i < mi->n_rates; i++) {
|
||||
@@ -103,14 +103,16 @@ minstrel_stats_open(struct inode *inode, struct file *file)
|
||||
p += sprintf(p, " %3u%s ", mr->bitrate / 2,
|
||||
(mr->bitrate & 1 ? ".5" : " "));
|
||||
p += sprintf(p, "%3u ", i);
|
||||
p += sprintf(p, "%6u ", mr->perfect_tx_time);
|
||||
p += sprintf(p, "%6u ", mr->perfect_tx_time);
|
||||
|
||||
tp_avg = minstrel_get_tp_avg(mr);
|
||||
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 %3u.%1u %3u.%1u %3u"
|
||||
p += sprintf(p, "%4u.%1u %4u.%1u %3u.%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 / 10, prob % 10,
|
||||
@@ -144,7 +146,7 @@ minstrel_stats_csv_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct minstrel_sta_info *mi = inode->i_private;
|
||||
struct minstrel_debugfs_info *ms;
|
||||
unsigned int i, tp_avg, prob, eprob;
|
||||
unsigned int i, tp_max, tp_avg, prob, eprob;
|
||||
char *p;
|
||||
|
||||
ms = kmalloc(2048, GFP_KERNEL);
|
||||
@@ -169,12 +171,14 @@ minstrel_stats_csv_open(struct inode *inode, struct file *file)
|
||||
p += sprintf(p, "%u,", i);
|
||||
p += sprintf(p, "%u,",mr->perfect_tx_time);
|
||||
|
||||
tp_avg = minstrel_get_tp_avg(mr);
|
||||
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,"
|
||||
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,
|
||||
prob / 10, prob % 10,
|
||||
|
Reference in New Issue
Block a user