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

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: 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
Loading
Loading
Loading
Loading
+23 −35
Original line number Diff line number Diff line
@@ -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;
	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,32 +1071,25 @@ 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;
	}
@@ -1111,10 +1099,10 @@ static int lprocfs_stats_seq_show(struct seq_file *p, void *v)
}

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)