diff options
author | John L. Hammond <john.hammond@intel.com> | 2013-06-03 21:40:51 +0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-06-03 11:26:36 -0700 |
commit | edb4973dbc4b729098ba081225bf370e19081127 (patch) | |
tree | 4bc3fbf8ad64147034c6796e01ce5dfab20968ff | |
parent | 3b2f75fd590dfefffc11dc5050ca90394fc1a70d (diff) |
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/6328
Signed-off-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: wangdi <di.wang@intel.com>
Reviewed-by: Bobi Jam <bobijam@gmail.com>
Reviewed-by: Emoly Liu <emoly.liu@intel.com>
Reviewed-by: Keith Mannthey <keith.mannthey@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
Signed-off-by: Peng Tao <tao.peng@emc.com>
Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/lustre/lustre/obdclass/lprocfs_status.c | 58 |
1 files changed, 23 insertions, 35 deletions
diff --git a/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c b/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c index 7d92db950c2c..3b157f89c300 100644 --- a/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c +++ b/drivers/staging/lustre/lustre/obdclass/lprocfs_status.c @@ -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) { struct lprocfs_stats *stats = p->private; - /* return 1st cpu location */ - return (*pos >= stats->ls_num) ? NULL : - lprocfs_stats_counter_get(stats, 0, *pos); + + return (*pos < stats->ls_num) ? pos : NULL; } 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) { - struct lprocfs_stats *stats = p->private; - ++*pos; - return (*pos >= stats->ls_num) ? NULL : - lprocfs_stats_counter_get(stats, 0, *pos); + (*pos)++; + return lprocfs_stats_seq_start(p, pos); } /* seq file export of one lprocfs counter */ static int lprocfs_stats_seq_show(struct seq_file *p, void *v) { struct lprocfs_stats *stats = p->private; - struct lprocfs_counter *cntr = v; - struct lprocfs_counter ret; - struct lprocfs_counter_header *header; - int entry_size; - int idx; - int rc = 0; + struct lprocfs_counter_header *hdr; + struct lprocfs_counter ctr; + int idx = *(loff_t *)v; + int rc = 0; - if (cntr == &(stats->ls_percpu[0])->lp_cntr[0]) { + if (idx == 0) { struct timeval now; do_gettimeofday(&now); 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) if (rc < 0) return rc; } - entry_size = sizeof(*cntr); - if (stats->ls_flags & LPROCFS_STATS_FLAG_IRQ_SAFE) - 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); + hdr = &stats->ls_cnt_header[idx]; + lprocfs_stats_collect(stats, idx, &ctr); - if (ret.lc_count == 0) + if (ctr.lc_count == 0) goto out; - rc = seq_printf(p, "%-25s "LPD64" samples [%s]", header->lc_name, - ret.lc_count, header->lc_units); + rc = seq_printf(p, "%-25s "LPD64" samples [%s]", hdr->lc_name, + ctr.lc_count, hdr->lc_units); if (rc < 0) goto out; - if ((header->lc_config & LPROCFS_CNTR_AVGMINMAX) && - (ret.lc_count > 0)) { + if ((hdr->lc_config & LPROCFS_CNTR_AVGMINMAX) && (ctr.lc_count > 0)) { 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) goto out; - if (header->lc_config & LPROCFS_CNTR_STDDEV) - rc = seq_printf(p, " "LPD64, ret.lc_sumsquare); + if (hdr->lc_config & LPROCFS_CNTR_STDDEV) + rc = seq_printf(p, " "LPD64, ctr.lc_sumsquare); if (rc < 0) goto out; } rc = seq_printf(p, "\n"); - out: +out: return (rc < 0) ? rc : 0; } struct seq_operations lprocfs_stats_seq_sops = { - start: lprocfs_stats_seq_start, - stop: lprocfs_stats_seq_stop, - next: lprocfs_stats_seq_next, - show: lprocfs_stats_seq_show, + .start = lprocfs_stats_seq_start, + .stop = lprocfs_stats_seq_stop, + .next = lprocfs_stats_seq_next, + .show = lprocfs_stats_seq_show, }; static int lprocfs_stats_seq_open(struct inode *inode, struct file *file) |