* [Patch] statistics: simplify statistics' debugfs read functions
@ 2007-04-10 15:43 Martin Peschke
0 siblings, 0 replies; only message in thread
From: Martin Peschke @ 2007-04-10 15:43 UTC (permalink / raw)
To: akpm; +Cc: linux-kernel, linux-s390
This patch replaces some ugly code implementing debugfs files.
The cleaned up code uses seq_file. File contents remains unchanged.
Patch is against 2.6.21-rc6-mm1.
Signed-off-by: Martin Peschke <mp3@de.ibm.com>
---
statistic.c | 588 ++++++++++++++++++++++++++++--------------------------------
1 file changed, 275 insertions(+), 313 deletions(-)
Index: linux/lib/statistic.c
===================================================================
--- linux.orig/lib/statistic.c
+++ linux/lib/statistic.c
@@ -57,31 +57,20 @@
#include <linux/cpu.h>
#include <linux/percpu.h>
#include <linux/mutex.h>
+#include <linux/seq_file.h>
#include <linux/statistic.h>
#include <asm/bug.h>
#include <asm/uaccess.h>
-struct statistic_file_private {
- struct list_head read_seg_lh;
- size_t w_offset;
- char *w_buf;
-};
-
-struct statistic_merge_private {
- struct statistic *stat;
- spinlock_t lock;
- void *dst;
-};
-
/**
* struct statistic_discipline - description of a data processing mode
* @parse: parses additional attributes specific to this mode (if any)
* @size: sizes a data area prior to allocation (mandatory)
* @reset: discards content of a data area (mandatory)
* @merge: merges content of a data area into another data area (mandatory)
- * @fdata: prints content of a data area into buffer (mandatory)
- * @fdef: prints additional attributes specific to this mode (if any)
+ * @def: prints additional attributes specific to this mode (if any)
+ * @data: prints content of a data area into buffer (mandatory)
* @add: updates a data area for a statistic fed incremental data (mandatory)
* @set: updates a data area for a statistic fed total numbers (mandatory)
* @name: pointer to name string (mandatory)
@@ -104,9 +93,9 @@ struct statistic_discipline {
size_t (*size)(struct statistic * stat);
void (*reset)(struct statistic *stat, void *ptr);
void (*merge)(struct statistic *stat, void *dst, void *src);
- int (*fdata)(struct statistic *stat, const char *name,
- struct statistic_file_private *fpriv, void *data);
- int (*fdef)(struct statistic *stat, char *line);
+ void (*def)(struct statistic *stat, struct seq_file *seq);
+ void (*data)(struct statistic *stat, struct seq_file *seq,
+ const char *name);
void (*add)(struct statistic *stat, s64 value, u64 incr);
void (*set)(struct statistic *stat, s64 value, u64 total);
char *name;
@@ -248,7 +237,13 @@ static int statistic_reset(struct statis
return 0;
}
-static void statistic_merge(void *__mpriv)
+struct statistic_merge_private {
+ struct statistic *stat;
+ spinlock_t lock;
+ void *dst;
+};
+
+static void _statistic_merge(void *__mpriv)
{
struct statistic_merge_private *mpriv = __mpriv;
struct statistic *stat = mpriv->stat;
@@ -260,121 +255,26 @@ static void statistic_merge(void *__mpri
spin_unlock(&mpriv->lock);
}
-struct sgrb_seg {
- struct list_head list;
- char *address;
- int offset;
- int size;
-};
-
-static struct sgrb_seg *sgrb_seg_find(struct list_head *lh, int size)
-{
- struct sgrb_seg *seg;
-
- /* only the last buffer, if any, may have spare bytes */
- list_for_each_entry_reverse(seg, lh, list) {
- if (likely((PAGE_SIZE - seg->offset) >= size))
- return seg;
- break;
- }
- seg = kzalloc(sizeof(struct sgrb_seg), GFP_KERNEL);
- if (unlikely(!seg))
- return NULL;
- seg->size = PAGE_SIZE;
- seg->address = (void*)__get_free_page(GFP_KERNEL);
- if (unlikely(!seg->address)) {
- kfree(seg);
- return NULL;
- }
- list_add_tail(&seg->list, lh);
- return seg;
-}
-
-static void sgrb_seg_release_all(struct list_head *lh)
-{
- struct sgrb_seg *seg, *tmp;
-
- list_for_each_entry_safe(seg, tmp, lh, list) {
- list_del(&seg->list);
- free_page((unsigned long)seg->address);
- kfree(seg);
- }
-}
-
-static char *statistic_state_strings[] = {
- "undefined(BUG)",
- "unconfigured",
- "released",
- "off",
- "on",
-};
-
-static int statistic_fdef(struct statistic_interface *interface, int i,
- struct statistic_file_private *private)
-{
- struct statistic *stat = &interface->stat[i];
- struct statistic_info *info = &interface->info[i];
- struct statistic_discipline *disc = &statistic_discs[stat->type];
- struct sgrb_seg *seg;
- char t0[TIMESTAMP_SIZE], t1[TIMESTAMP_SIZE], t2[TIMESTAMP_SIZE];
-
- seg = sgrb_seg_find(&private->read_seg_lh, 512);
- if (unlikely(!seg))
- return -ENOMEM;
-
- seg->offset += sprintf(seg->address + seg->offset,
- "name=%s state=%s units=%s/%s",
- info->name, statistic_state_strings[stat->state],
- info->x_unit, info->y_unit);
- if (stat->state == STATISTIC_STATE_UNCONFIGURED) {
- seg->offset += sprintf(seg->address + seg->offset, "\n");
- return 0;
- }
-
- seg->offset += sprintf(seg->address + seg->offset, " type=%s",
- disc->name);
- if (info->flags & STATISTIC_FLAGS_NOFLEX)
- seg->offset += sprintf(seg->address + seg->offset, "(fix)");
-
- if (disc->fdef)
- seg->offset += disc->fdef(stat, seg->address + seg->offset);
- if (stat->state == STATISTIC_STATE_RELEASED) {
- seg->offset += sprintf(seg->address + seg->offset, "\n");
- return 0;
- }
-
- nsec_to_timestamp(t0, stat->age);
- nsec_to_timestamp(t1, stat->started);
- nsec_to_timestamp(t2, stat->stopped);
- seg->offset += sprintf(seg->address + seg->offset,
- " data=%s started=%s stopped=%s\n", t0, t1, t2);
- return 0;
-}
-
-static int statistic_fdata(struct statistic_interface *interface, int i,
- struct statistic_file_private *fpriv)
+static void *statistic_merge(struct statistic_interface *interface, int i)
{
struct statistic *stat = &interface->stat[i];
struct statistic_info *info = &interface->info[i];
struct statistic_discipline *disc = &statistic_discs[stat->type];
struct statistic_merge_private mpriv;
size_t size = disc->size(stat);
- int retval;
- if (unlikely(stat->state < STATISTIC_STATE_OFF))
- return 0;
- if (unlikely(info->flags & STATISTIC_FLAGS_NOINCR))
- return disc->fdata(stat, info->name, fpriv, stat->data);
mpriv.dst = kzalloc(size, GFP_KERNEL);
if (unlikely(!mpriv.dst))
- return -ENOMEM;
+ return NULL;
disc->reset(stat, mpriv.dst);
- spin_lock_init(&mpriv.lock);
- mpriv.stat = stat;
- on_each_cpu(statistic_merge, &mpriv, 0, 1);
- retval = disc->fdata(stat, info->name, fpriv, mpriv.dst);
- kfree(mpriv.dst);
- return retval;
+ if (unlikely(info->flags & STATISTIC_FLAGS_NOINCR))
+ disc->merge(stat, &mpriv.dst, stat->data);
+ else {
+ spin_lock_init(&mpriv.lock);
+ mpriv.stat = stat;
+ on_each_cpu(_statistic_merge, &mpriv, 0, 1);
+ }
+ return mpriv.dst;
}
/* cpu hotplug handling for per-cpu data */
@@ -578,150 +478,258 @@ static void statistic_parse_line(struct
/* sequential files comprising user interface */
-static int statistic_generic_open(struct inode *inode,
- struct file *file, struct statistic_interface **interface,
- struct statistic_file_private **private)
-{
- *interface = inode->i_private;
- BUG_ON(!interface);
- *private = kzalloc(sizeof(struct statistic_file_private), GFP_KERNEL);
- if (unlikely(!*private))
- return -ENOMEM;
- INIT_LIST_HEAD(&(*private)->read_seg_lh);
- file->private_data = *private;
+struct statistic_seq_private {
+ struct statistic_interface *interface;
+ int i;
+ size_t w_offset;
+ char *w_buf;
+ struct statistic *stat;
+};
+
+static void *statistic_seq_traverse(struct seq_file *seq, loff_t *pos, int inc,
+ struct statistic_seq_private *seq_priv)
+{
+ *pos += inc;
+ if (*pos >= seq_priv->interface->number)
+ return NULL;
+ seq_priv->i = *pos;
+ return seq_priv;
+}
+
+static void *statistic_seq_start(struct seq_file *seq, loff_t *pos)
+{
+ return statistic_seq_traverse(seq, pos, 0, seq->private);
+}
+
+static void *statistic_seq_next(struct seq_file *seq, void *_seq_priv, loff_t *pos)
+{
+ return statistic_seq_traverse(seq, pos, 1, _seq_priv);
+}
+
+static void statistic_seq_stop(struct seq_file *seq, void *_seq_priv)
+{
+}
+
+static char *statistic_state_strings[] = {
+ "undefined(BUG)",
+ "unconfigured",
+ "released",
+ "off",
+ "on",
+};
+
+static int statistic_seq_show_def(struct seq_file *seq, void *_seq_priv)
+{
+ struct statistic_seq_private *seq_priv = _seq_priv;
+ struct statistic_interface *interface = seq_priv->interface;
+ struct statistic *stat = &interface->stat[seq_priv->i];
+ struct statistic_info *info = &interface->info[seq_priv->i];
+ struct statistic_discipline *disc = &statistic_discs[stat->type];
+ char t0[TIMESTAMP_SIZE], t1[TIMESTAMP_SIZE], t2[TIMESTAMP_SIZE];
+
+ seq_printf(seq, "name=%s", info->name);
+ seq_printf(seq, " state=%s", statistic_state_strings[stat->state]);
+ seq_printf(seq, " units=%s/%s", info->x_unit, info->y_unit);
+
+ if (stat->state == STATISTIC_STATE_UNCONFIGURED) {
+ seq_printf(seq, "\n");
+ return 0;
+ }
+
+ seq_printf(seq, " type=%s", disc->name);
+ if (info->flags & STATISTIC_FLAGS_NOFLEX)
+ seq_printf(seq, "(fix)");
+
+ if (disc->def)
+ disc->def(stat, seq);
+
+ if (stat->state == STATISTIC_STATE_RELEASED) {
+ seq_printf(seq, "\n");
+ return 0;
+ }
+
+ nsec_to_timestamp(t0, stat->age);
+ nsec_to_timestamp(t1, stat->started);
+ nsec_to_timestamp(t2, stat->stopped);
+ seq_printf(seq, " data=%s started=%s stopped=%s\n", t0, t1, t2);
return 0;
}
-static int statistic_generic_close(struct inode *inode, struct file *file)
+static int statistic_seq_show_data(struct seq_file *seq, void *_seq_priv)
{
- struct statistic_file_private *private = file->private_data;
- BUG_ON(!private);
- sgrb_seg_release_all(&private->read_seg_lh);
- kfree(private);
+ struct statistic_seq_private *seq_priv = _seq_priv;
+ struct statistic_interface *interface = seq_priv->interface;
+ struct statistic *stat = &seq_priv->stat[seq_priv->i];
+ struct statistic_info *info = &interface->info[seq_priv->i];
+ struct statistic_discipline *disc = &statistic_discs[stat->type];
+
+ if (stat->state >= STATISTIC_STATE_OFF)
+ disc->data(stat, seq, info->name);
return 0;
}
-static ssize_t statistic_generic_read(struct file *file,
- char __user *buf, size_t len, loff_t *offset)
+static struct seq_operations statistic_seq_ops_def = {
+ .start = statistic_seq_start,
+ .stop = statistic_seq_stop,
+ .next = statistic_seq_next,
+ .show = statistic_seq_show_def,
+};
+
+static struct seq_operations statistic_seq_ops_data = {
+ .start = statistic_seq_start,
+ .stop = statistic_seq_stop,
+ .next = statistic_seq_next,
+ .show = statistic_seq_show_data,
+};
+
+static int statistic_open_def(struct inode *inode, struct file *file)
{
- struct statistic_file_private *private = file->private_data;
- struct sgrb_seg *seg;
- size_t seg_offset, seg_residual, seg_transfer;
- size_t transfered = 0;
- loff_t pos = 0;
-
- BUG_ON(!private);
- list_for_each_entry(seg, &private->read_seg_lh, list) {
- if (unlikely(!len))
- break;
- if (*offset >= pos && *offset <= (pos + seg->offset)) {
- seg_offset = *offset - pos;
- seg_residual = seg->offset - seg_offset;
- seg_transfer = min(len, seg_residual);
- if (unlikely(copy_to_user(buf + transfered,
- seg->address + seg_offset,
- seg_transfer)))
- return -EFAULT;
- transfered += seg_transfer;
- *offset += seg_transfer;
- pos += seg_transfer + seg_offset;
- len -= seg_transfer;
- } else
- pos += seg->offset;
+ struct statistic_seq_private *seq_priv;
+ struct seq_file *seq;
+ int retval;
+
+ seq_priv = kzalloc(sizeof(struct statistic_seq_private), GFP_KERNEL);
+ if (!seq_priv)
+ return -ENOMEM;
+ seq_priv->interface = inode->i_private;
+ retval = seq_open(file, &statistic_seq_ops_def);
+ if (!retval) {
+ seq = file->private_data;
+ seq->private = seq_priv;
+ } else
+ kfree(seq_priv);
+ return retval;
+}
+
+static int statistic_release_def(struct inode *inode, struct file *file)
+{
+ struct statistic_interface *interface = inode->i_private;
+ struct seq_file *seq = file->private_data;
+ struct statistic_seq_private *seq_priv = seq->private;
+ char *p, *q = seq_priv->w_buf;
+
+ if (seq_priv->w_buf) {
+ while ((p = strsep(&q, "\n")))
+ statistic_parse_line(interface, p);
+ kfree(seq_priv->w_buf);
}
- return transfered;
+ return seq_release_private(inode, file);
}
-static ssize_t statistic_def_write(struct file *file, const char __user *buf,
+static ssize_t statistic_write_def(struct file *file, const char __user *buf,
size_t len, loff_t *offset)
{
- struct statistic_file_private *private = file->private_data;
+ struct seq_file *seq = file->private_data;
+ struct statistic_seq_private *seq_priv = seq->private;
char *larger;
- if (unlikely(*offset != private->w_offset))
+ if (unlikely(*offset != seq_priv->w_offset))
return -EPIPE;
if (*offset + len > 16 * PAGE_SIZE)
return -ENOMEM;
larger = kmalloc(*offset + len, GFP_KERNEL);
if (!larger)
return -ENOMEM;
- memcpy(larger, private->w_buf, *offset);
+ memcpy(larger, seq_priv->w_buf, *offset);
if (copy_from_user(larger + *offset, buf, len))
return -EFAULT;
*offset += len;
- kfree(private->w_buf);
- private->w_buf = larger;
- private->w_offset = *offset;
+ kfree(seq_priv->w_buf);
+ seq_priv->w_buf = larger;
+ seq_priv->w_offset = *offset;
return len;
}
-static int statistic_def_close(struct inode *inode, struct file *file)
+static struct file_operations statistic_def_fops = {
+ .owner = THIS_MODULE,
+ .open = statistic_open_def,
+ .release = statistic_release_def,
+ .write = statistic_write_def,
+ .read = seq_read,
+ .llseek = seq_lseek,
+};
+
+static int statistic_open_data(struct inode *inode, struct file *file)
{
struct statistic_interface *interface = inode->i_private;
- struct statistic_file_private *private = file->private_data;
- char *p, *q = private->w_buf;
+ struct statistic *stat;
+ struct statistic_discipline *disc;
+ struct statistic_seq_private *seq_priv;
+ struct seq_file *seq;
+ int size, i, j, retval = -ENOMEM;
- while ((p = strsep(&q, "\n")))
- statistic_parse_line(interface, p);
- kfree(private->w_buf);
- return 0;
-}
+ if (interface->pull)
+ interface->pull(interface->pull_private);
-static int statistic_def_open(struct inode *inode, struct file *file)
-{
- struct statistic_interface *interface;
- struct statistic_file_private *private;
- int retval = 0;
- int i;
+ size = interface->number * sizeof(struct statistic);
+ seq_priv = kzalloc(sizeof(struct statistic_seq_private), GFP_KERNEL);
+ if (!seq_priv)
+ goto failed_priv;
+
+ seq_priv->interface = interface;
+ seq_priv->stat = stat = kmalloc(size, GFP_KERNEL);
+ if (!stat)
+ goto failed_stat;
- retval = statistic_generic_open(inode, file, &interface, &private);
- if (unlikely(retval))
- return retval;
+ memcpy(stat, interface->stat, size);
for (i = 0; i < interface->number; i++) {
- retval = statistic_fdef(interface, i, private);
- if (unlikely(retval)) {
- statistic_def_close(inode, file);
- break;
- }
+ if (stat[i].state < STATISTIC_STATE_OFF)
+ continue;
+ stat[i].data = statistic_merge(interface, i);
+ if (!stat[i].data)
+ goto failed_merge;
}
+
+ retval = seq_open(file, &statistic_seq_ops_data);
+ if (retval)
+ goto failed_open;
+
+ seq = file->private_data;
+ seq->private = seq_priv;
+ return 0;
+
+failed_open:
+ for (j = 0; j < i; j++) {
+ if (stat[j].state < STATISTIC_STATE_OFF)
+ continue;
+ disc = &statistic_discs[stat[j].type];
+ disc->reset(&stat[j], stat[j].data);
+ kfree(stat[j].data);
+ }
+failed_merge:
+ kfree(stat);
+failed_stat:
+ kfree(seq_priv);
+failed_priv:
return retval;
}
-static int statistic_data_open(struct inode *inode, struct file *file)
+static int statistic_release_data(struct inode *inode, struct file *file)
{
- struct statistic_interface *interface;
- struct statistic_file_private *private;
- int retval = 0;
+ struct seq_file *seq = file->private_data;
+ struct statistic_seq_private *seq_priv = seq->private;
+ struct statistic_interface *interface = seq_priv->interface;
+ struct statistic *stat = seq_priv->stat;
+ struct statistic_discipline *disc;
int i;
- retval = statistic_generic_open(inode, file, &interface, &private);
- if (unlikely(retval))
- return retval;
- if (interface->pull)
- interface->pull(interface->pull_private);
for (i = 0; i < interface->number; i++) {
- retval = statistic_fdata(interface, i, private);
- if (unlikely(retval)) {
- statistic_generic_close(inode, file);
- break;
- }
+ if (stat[i].state < STATISTIC_STATE_OFF)
+ continue;
+ disc = &statistic_discs[stat[i].type];
+ disc->reset(&stat[i], stat[i].data);
+ kfree(stat[i].data);
}
- return retval;
+ kfree(stat);
+ return seq_release_private(inode, file);
}
-static struct file_operations statistic_def_fops = {
- .owner = THIS_MODULE,
- .read = statistic_generic_read,
- .write = statistic_def_write,
- .open = statistic_def_open,
- .release = statistic_def_close,
-};
-
static struct file_operations statistic_data_fops = {
.owner = THIS_MODULE,
- .read = statistic_generic_read,
- .open = statistic_data_open,
- .release = statistic_generic_close,
+ .open = statistic_open_data,
+ .release = statistic_release_data,
+ .read = seq_read,
+ .llseek = seq_lseek,
};
/* code concerned with single value statistics */
@@ -770,17 +778,10 @@ static void statistic_merge_counter(stru
*(u64*)dst += *(u64*)src;
}
-static int statistic_fdata_counter(struct statistic *stat, const char *name,
- struct statistic_file_private *fpriv,
- void *data)
-{
- struct sgrb_seg *seg;
- seg = sgrb_seg_find(&fpriv->read_seg_lh, 128);
- if (unlikely(!seg))
- return -ENOMEM;
- seg->offset += sprintf(seg->address + seg->offset, "%s %Lu\n",
- name, *(unsigned long long *)data);
- return 0;
+static void statistic_data_counter(struct statistic *stat, struct seq_file *seq,
+ const char *name)
+{
+ seq_printf(seq, "%s %Lu\n", name, *(unsigned long long *)stat->data);
}
/* code concerned with utilisation indicator statistic */
@@ -863,34 +864,21 @@ static int statistic_div(signed long lon
return 0;
}
-static int statistic_fdata_util(struct statistic *stat, const char *name,
- struct statistic_file_private *fpriv,
- void *data)
+static void statistic_data_util(struct statistic *stat, struct seq_file *seq,
+ const char *name)
{
- struct sgrb_seg *seg;
- struct statistic_entry_util *util = data;
+ struct statistic_entry_util *util = stat->data;
unsigned long long mean_w = 0, mean_d = 0, var_w = 0, var_d = 0,
num = util->num, acc = util->acc, sqr = util->sqr;
signed long long min = num ? util->min : 0,
max = num ? util->max : 0;
- seg = sgrb_seg_find(&fpriv->read_seg_lh, 512);
- if (unlikely(!seg))
- return -ENOMEM;
statistic_div(&mean_w, &mean_d, acc, num, 3);
statistic_div(&var_w, &var_d, sqr - mean_w * mean_w, num, 3);
- seg->offset += sprintf(seg->address + seg->offset,
- "%s samples %Lu\n"
- "%s minimum %Ld\n"
- "%s average %Ld.%03Ld\n"
- "%s maximum %Ld\n"
- "%s variance %Ld.%03Ld\n",
- name, num,
- name, min,
- name, mean_w, mean_d,
- name, max,
- name, var_w, var_d);
- return 0;
+ seq_printf(seq, "%s samples %Lu\n%s minimum %Ld\n"
+ "%s average %Ld.%03Ld\n%s maximum %Ld\n"
+ "%s variance %Ld.%03Ld\n", name, num, name, min,
+ name, mean_w, mean_d, name, max, name, var_w, var_d);
}
/* code concerned with histogram statistics */
@@ -985,43 +973,28 @@ static void statistic_merge_histogram(st
dst[i] += src[i];
}
-static int statistic_fdata_histogram_line(const char *name,
- struct statistic_file_private *private,
- const char *prefix, s64 bound, u64 hits)
-{
- struct sgrb_seg *seg;
- seg = sgrb_seg_find(&private->read_seg_lh, 256);
- if (unlikely(!seg))
- return -ENOMEM;
- seg->offset += sprintf(seg->address + seg->offset, "%s %s%Ld %Lu\n",
- name, prefix, (signed long long)bound,
- (unsigned long long)hits);
- return 0;
-}
-
-static int statistic_fdata_histogram(struct statistic *stat, const char *name,
- struct statistic_file_private *fpriv,
- void *data)
+static void statistic_data_histogram(struct statistic *stat,
+ struct seq_file *seq, const char *name)
{
- int i, retval;
- s64 bound = 0;
+ int i;
+ signed long long bound = 0;
+ unsigned long long hits = 0;
+
for (i = 0; i < (stat->u.histogram.last_index); i++) {
bound = statistic_histogram_calc_value(stat, i);
- retval = statistic_fdata_histogram_line(name, fpriv, "<=",
- bound, ((u64*)data)[i]);
- if (unlikely(retval))
- return retval;
+ hits = ((u64*)stat->data)[i];
+ seq_printf(seq, "%s <=%Ld %Lu\n", name, bound, hits);
}
- return statistic_fdata_histogram_line(name, fpriv, ">",
- bound, ((u64*)data)[i]);
+ seq_printf(seq, "%s >%Ld %Lu\n", name, bound, hits);
}
-static int statistic_fdef_histogram(struct statistic *stat, char *line)
+static void statistic_def_histogram(struct statistic *stat,
+ struct seq_file *seq)
{
- return sprintf(line, " range_min=%Li entries=%Li base_interval=%Lu",
- (signed long long)stat->u.histogram.range_min,
- (unsigned long long)(stat->u.histogram.last_index + 1),
- (unsigned long long)stat->u.histogram.base_interval);
+ seq_printf(seq, " range_min=%Li entries=%Li base_interval=%Lu",
+ (signed long long)stat->u.histogram.range_min,
+ (unsigned long long)(stat->u.histogram.last_index + 1),
+ (unsigned long long)stat->u.histogram.base_interval);
}
static match_table_t statistic_match_histogram = {
@@ -1191,34 +1164,23 @@ static void statistic_merge_sparse(struc
_statistic_add_sparse(dst, entry->value, entry->hits);
}
-static int statistic_fdata_sparse(struct statistic *stat, const char *name,
- struct statistic_file_private *fpriv,
- void *data)
+static void statistic_data_sparse(struct statistic *stat, struct seq_file *seq,
+ const char *name)
{
- struct sgrb_seg *seg;
- struct statistic_sparse_list *slist = data;
+ struct statistic_sparse_list *slist = stat->data;
struct statistic_entry_sparse *entry;
- seg = sgrb_seg_find(&fpriv->read_seg_lh, 256);
- if (unlikely(!seg))
- return -ENOMEM;
- seg->offset += sprintf(seg->address + seg->offset, "%s missed 0x%Lu\n",
- name, (unsigned long long)slist->hits_missed);
- list_for_each_entry(entry, &slist->entry_lh, list) {
- seg = sgrb_seg_find(&fpriv->read_seg_lh, 256);
- if (unlikely(!seg))
- return -ENOMEM;
- seg->offset += sprintf(seg->address + seg->offset,
- "%s 0x%Lx %Lu\n", name,
- (signed long long)entry->value,
- (unsigned long long)entry->hits);
- }
- return 0;
+ seq_printf(seq, "%s missed 0x%Lu\n", name,
+ (unsigned long long)slist->hits_missed);
+ list_for_each_entry(entry, &slist->entry_lh, list)
+ seq_printf(seq, "%s 0x%Lx %Lu\n", name,
+ (signed long long)entry->value,
+ (unsigned long long)entry->hits);
}
-static int statistic_fdef_sparse(struct statistic *stat, char *line)
+static void statistic_def_sparse(struct statistic *stat, struct seq_file *seq)
{
- return sprintf(line, " entries=%u", stat->u.sparse.entries_max);
+ seq_printf(seq, " entries=%u", stat->u.sparse.entries_max);
}
static match_table_t statistic_match_sparse = {
@@ -1249,7 +1211,7 @@ static struct statistic_discipline stati
.size = statistic_size_counter,
.reset = statistic_reset_counter,
.merge = statistic_merge_counter,
- .fdata = statistic_fdata_counter,
+ .data = statistic_data_counter,
.add = statistic_add_counter_inc,
.set = statistic_set_counter_inc,
.name = "counter_inc",
@@ -1258,7 +1220,7 @@ static struct statistic_discipline stati
.size = statistic_size_counter,
.reset = statistic_reset_counter,
.merge = statistic_merge_counter,
- .fdata = statistic_fdata_counter,
+ .data = statistic_data_counter,
.add = statistic_add_counter_prod,
.set = statistic_set_counter_prod,
.name = "counter_prod",
@@ -1267,7 +1229,7 @@ static struct statistic_discipline stati
.size = statistic_size_util,
.reset = statistic_reset_util,
.merge = statistic_merge_util,
- .fdata = statistic_fdata_util,
+ .data = statistic_data_util,
.add = statistic_add_util,
.set = statistic_set_util,
.name = "utilisation",
@@ -1277,8 +1239,8 @@ static struct statistic_discipline stati
.size = statistic_size_histogram,
.reset = statistic_reset_histogram,
.merge = statistic_merge_histogram,
- .fdata = statistic_fdata_histogram,
- .fdef = statistic_fdef_histogram,
+ .def = statistic_def_histogram,
+ .data = statistic_data_histogram,
.add = statistic_add_histogram_lin,
.set = statistic_set_histogram_lin,
.name = "histogram_lin",
@@ -1288,8 +1250,8 @@ static struct statistic_discipline stati
.size = statistic_size_histogram,
.reset = statistic_reset_histogram,
.merge = statistic_merge_histogram,
- .fdata = statistic_fdata_histogram,
- .fdef = statistic_fdef_histogram,
+ .def = statistic_def_histogram,
+ .data = statistic_data_histogram,
.add = statistic_add_histogram_log2,
.set = statistic_set_histogram_log2,
.name = "histogram_log2",
@@ -1299,8 +1261,8 @@ static struct statistic_discipline stati
.size = statistic_size_sparse,
.reset = statistic_reset_sparse,
.merge = statistic_merge_sparse,
- .fdata = statistic_fdata_sparse,
- .fdef = statistic_fdef_sparse,
+ .def = statistic_def_sparse,
+ .data = statistic_data_sparse,
.add = statistic_add_sparse,
.set = statistic_set_sparse,
.name = "sparse",
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-04-10 15:43 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-10 15:43 [Patch] statistics: simplify statistics' debugfs read functions Martin Peschke
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.