Commit edb4973d authored by John L. Hammond's avatar John L. Hammond Committed by Greg Kroah-Hartman

staging/lustre/lprocfs: use stats counter index for *pos

In lprocfs_stats_seq_{start,next,show,stop}() encode the counter index
(rather than the counter address) into *pos. Doing so simplifies these
functions and fixes a bug in the case of per-CPU stats where no stats
would be displayed at all if no events had yet occurred on CPU 0.

Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-2979
Lustre-change: http://review.whamcloud.com/6328Signed-off-by: default avatarJohn L. Hammond <john.hammond@intel.com>
Reviewed-by: default avatarwangdi <di.wang@intel.com>
Reviewed-by: default avatarBobi Jam <bobijam@gmail.com>
Reviewed-by: default avatarEmoly Liu <emoly.liu@intel.com>
Reviewed-by: default avatarKeith Mannthey <keith.mannthey@intel.com>
Reviewed-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarPeng Tao <tao.peng@emc.com>
Signed-off-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3b2f75fd
...@@ -1040,9 +1040,8 @@ static ssize_t lprocfs_stats_seq_write(struct file *file, ...@@ -1040,9 +1040,8 @@ static ssize_t lprocfs_stats_seq_write(struct file *file,
static void *lprocfs_stats_seq_start(struct seq_file *p, loff_t *pos) static void *lprocfs_stats_seq_start(struct seq_file *p, loff_t *pos)
{ {
struct lprocfs_stats *stats = p->private; struct lprocfs_stats *stats = p->private;
/* return 1st cpu location */
return (*pos >= stats->ls_num) ? NULL : return (*pos < stats->ls_num) ? pos : NULL;
lprocfs_stats_counter_get(stats, 0, *pos);
} }
static void lprocfs_stats_seq_stop(struct seq_file *p, void *v) static void lprocfs_stats_seq_stop(struct seq_file *p, void *v)
...@@ -1051,24 +1050,20 @@ static void lprocfs_stats_seq_stop(struct seq_file *p, void *v) ...@@ -1051,24 +1050,20 @@ static void lprocfs_stats_seq_stop(struct seq_file *p, void *v)
static void *lprocfs_stats_seq_next(struct seq_file *p, void *v, loff_t *pos) static void *lprocfs_stats_seq_next(struct seq_file *p, void *v, loff_t *pos)
{ {
struct lprocfs_stats *stats = p->private; (*pos)++;
++*pos; return lprocfs_stats_seq_start(p, pos);
return (*pos >= stats->ls_num) ? NULL :
lprocfs_stats_counter_get(stats, 0, *pos);
} }
/* seq file export of one lprocfs counter */ /* seq file export of one lprocfs counter */
static int lprocfs_stats_seq_show(struct seq_file *p, void *v) static int lprocfs_stats_seq_show(struct seq_file *p, void *v)
{ {
struct lprocfs_stats *stats = p->private; struct lprocfs_stats *stats = p->private;
struct lprocfs_counter *cntr = v; struct lprocfs_counter_header *hdr;
struct lprocfs_counter ret; struct lprocfs_counter ctr;
struct lprocfs_counter_header *header; int idx = *(loff_t *)v;
int entry_size; int rc = 0;
int idx;
int rc = 0;
if (cntr == &(stats->ls_percpu[0])->lp_cntr[0]) { if (idx == 0) {
struct timeval now; struct timeval now;
do_gettimeofday(&now); do_gettimeofday(&now);
rc = seq_printf(p, "%-25s %lu.%lu secs.usecs\n", rc = seq_printf(p, "%-25s %lu.%lu secs.usecs\n",
...@@ -1076,45 +1071,38 @@ static int lprocfs_stats_seq_show(struct seq_file *p, void *v) ...@@ -1076,45 +1071,38 @@ static int lprocfs_stats_seq_show(struct seq_file *p, void *v)
if (rc < 0) if (rc < 0)
return rc; return rc;
} }
entry_size = sizeof(*cntr); hdr = &stats->ls_cnt_header[idx];
if (stats->ls_flags & LPROCFS_STATS_FLAG_IRQ_SAFE) lprocfs_stats_collect(stats, idx, &ctr);
entry_size += sizeof(__s64);
idx = ((void *)cntr - (void *)&(stats->ls_percpu[0])->lp_cntr[0]) /
entry_size;
header = &stats->ls_cnt_header[idx];
lprocfs_stats_collect(stats, idx, &ret);
if (ret.lc_count == 0) if (ctr.lc_count == 0)
goto out; goto out;
rc = seq_printf(p, "%-25s "LPD64" samples [%s]", header->lc_name, rc = seq_printf(p, "%-25s "LPD64" samples [%s]", hdr->lc_name,
ret.lc_count, header->lc_units); ctr.lc_count, hdr->lc_units);
if (rc < 0) if (rc < 0)
goto out; goto out;
if ((header->lc_config & LPROCFS_CNTR_AVGMINMAX) && if ((hdr->lc_config & LPROCFS_CNTR_AVGMINMAX) && (ctr.lc_count > 0)) {
(ret.lc_count > 0)) {
rc = seq_printf(p, " "LPD64" "LPD64" "LPD64, rc = seq_printf(p, " "LPD64" "LPD64" "LPD64,
ret.lc_min, ret.lc_max, ret.lc_sum); ctr.lc_min, ctr.lc_max, ctr.lc_sum);
if (rc < 0) if (rc < 0)
goto out; goto out;
if (header->lc_config & LPROCFS_CNTR_STDDEV) if (hdr->lc_config & LPROCFS_CNTR_STDDEV)
rc = seq_printf(p, " "LPD64, ret.lc_sumsquare); rc = seq_printf(p, " "LPD64, ctr.lc_sumsquare);
if (rc < 0) if (rc < 0)
goto out; goto out;
} }
rc = seq_printf(p, "\n"); rc = seq_printf(p, "\n");
out: out:
return (rc < 0) ? rc : 0; return (rc < 0) ? rc : 0;
} }
struct seq_operations lprocfs_stats_seq_sops = { struct seq_operations lprocfs_stats_seq_sops = {
start: lprocfs_stats_seq_start, .start = lprocfs_stats_seq_start,
stop: lprocfs_stats_seq_stop, .stop = lprocfs_stats_seq_stop,
next: lprocfs_stats_seq_next, .next = lprocfs_stats_seq_next,
show: lprocfs_stats_seq_show, .show = lprocfs_stats_seq_show,
}; };
static int lprocfs_stats_seq_open(struct inode *inode, struct file *file) static int lprocfs_stats_seq_open(struct inode *inode, struct file *file)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment