Whamcloud - gitweb
LU-2979 lprocfs: use stats counter index for *pos
authorJohn L. Hammond <john.hammond@intel.com>
Mon, 13 May 2013 16:42:36 +0000 (11:42 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 14 May 2013 15:30:19 +0000 (11:30 -0400)
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.

Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: Id50f8ae480e151f8e16382db27eef8025ef69f15
Reviewed-on: http://review.whamcloud.com/6328
Tested-by: Hudson
Reviewed-by: wangdi <di.wang@intel.com>
Reviewed-by: Bobi Jam <bobijam@gmail.com>
Reviewed-by: Emoly Liu <emoly.liu@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Keith Mannthey <keith.mannthey@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/obdclass/lprocfs_status.c

index 5ce7661..97d4107 100644 (file)
@@ -1380,10 +1380,9 @@ static ssize_t lprocfs_stats_seq_write(struct file *file, const char *buf,
 
 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);
+       struct lprocfs_stats *stats = p->private;
+
+       return (*pos < stats->ls_num) ? pos : NULL;
 }
 
 static void lprocfs_stats_seq_stop(struct seq_file *p, void *v)
@@ -1392,70 +1391,61 @@ 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;
+
                cfs_gettimeofday(&now);
                rc = seq_printf(p, "%-25s %lu.%lu secs.usecs\n",
                                "snapshot_time", now.tv_sec, now.tv_usec);
                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)