[RFC] [Patch 2/4] statistics: cleanups

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Statistics code cleanups. Would not have been needed for the following
changes - just done along the way.

- make function void
- found more handy names for a few identifiers

Signed-off-by: Martin Peschke <[email protected]>
---

 drivers/s390/scsi/zfcp_def.h |    4
 include/linux/statistic.h    |   27 +++---
 lib/statistic.c              |  177 ++++++++++++++++++++-----------------------
 3 files changed, 100 insertions(+), 108 deletions(-)

Index: linux/include/linux/statistic.h
===================================================================
--- linux.orig/include/linux/statistic.h
+++ linux/include/linux/statistic.h
@@ -36,7 +36,7 @@
  *
  * Exploiters must setup an array of struct statistic_info for a
  * corresponding array of struct statistic, which are then pointed to
- * by struct statistic_interface.
+ * by struct statistic_ui.
  *
  * Struct statistic_info and all members and addressed strings must stay for
  * the lifetime of corresponding statistics created with statistic_create().
@@ -108,7 +108,7 @@ struct statistic {
 };
 
 /**
- * struct statistic_interface - collection of statistics for an entity
+ * struct statistic_ui - collection of statistics for an entity
  * @stat: a struct statistic array
  * @info: a struct statistic_info array describing the struct statistic array
  * @number: number of entries in both arrays
@@ -116,29 +116,29 @@ struct statistic {
  * @label: an optional function retrieving a label for each statistics entry
  * @private: optional data pointer reserved for use by clients
  *
- * Exploiters must setup a struct statistic_interface prior to calling
+ * Exploiters must setup a struct statistic_ui prior to calling
  * statistic_create().
  */
-struct statistic_interface {
+struct statistic_ui {
 /* private: */
 	struct list_head	 list;
-	void			*debugfs_dir;
-	void			*data_file;
-	void			*def_file;
+	void			*dir;
+	void			*data;
+	void			*def;
 /* public: */
 	struct statistic	*stat;
 	struct statistic_info	*info;
 	int			 number;
-	int			(*pull)(struct statistic_interface *interface);
-	void			(*label)(struct statistic_interface *interface,
+	void			(*pull)(struct statistic_ui *ui);
+	void			(*label)(struct statistic_ui *ui,
 					 int i, void *key, char *buf, int size);
 	void			*private;
 };
 
 #ifdef CONFIG_STATISTICS
 
-extern int statistic_create(struct statistic_interface *, const char *);
-extern int statistic_remove(struct statistic_interface *);
+extern int statistic_create(struct statistic_ui *, const char *);
+extern int statistic_remove(struct statistic_ui *);
 
 extern void statistic_set(struct statistic *, int, s64, u64);
 extern void statistic_set_key(struct statistic *, int, void *, u64);
@@ -313,13 +313,12 @@ static inline void statistic_add_as_key(
 #else /* !CONFIG_STATISTICS */
 /* These NOP functions unburden clients from handling !CONFIG_STATISTICS. */
 
-static inline int statistic_create(struct statistic_interface *interface,
-				   const char *name)
+static inline int statistic_create(struct statistic_ui *ui, const char *name)
 {
 	return 0;
 }
 
-static inline int statistic_remove(struct statistic_interface *interface)
+static inline int statistic_remove(struct statistic_ui *ui)
 {
 	return 0;
 }
Index: linux/lib/statistic.c
===================================================================
--- linux.orig/lib/statistic.c
+++ linux/lib/statistic.c
@@ -94,7 +94,7 @@ struct statistic_discipline {
 	void (*merge)(struct statistic *stat, void *dst, void *src);
 	void (*def)(struct statistic *stat, struct seq_file *seq);
 	void (*data)(struct statistic *stat, struct seq_file *seq,
-		     struct statistic_interface *interface, int i);
+		     struct statistic_ui *ui, int i);
 	void (*add)(struct statistic *stat, s64 value, u64 incr);
 	void (*set)(struct statistic *stat, s64 value, u64 total);
 	void (*kadd)(struct statistic *stat, void *key, u64 incr);
@@ -256,10 +256,10 @@ static void _statistic_merge(void *__mpr
 	spin_unlock(&mpriv->lock);
 }
 
-static void *statistic_merge(struct statistic_interface *interface, int i)
+static void *statistic_merge(struct statistic_ui *ui, int i)
 {
-	struct statistic *stat = &interface->stat[i];
-	struct statistic_info *info = &interface->info[i];
+	struct statistic *stat = &ui->stat[i];
+	struct statistic_info *info = &ui->info[i];
 	struct statistic_discipline *disc = &statistic_discs[stat->type];
 	struct statistic_merge_private mpriv;
 	size_t size = disc->size(stat);
@@ -280,11 +280,11 @@ static void *statistic_merge(struct stat
 
 /* cpu hotplug handling for per-cpu data */
 
-static int _statistic_hotcpu(struct statistic_interface *interface,
-			     int i, unsigned long action, int cpu)
+static int _statistic_hotcpu(struct statistic_ui *ui, int i,
+			     unsigned long action, int cpu)
 {
-	struct statistic *stat = &interface->stat[i];
-	struct statistic_info *info = &interface->info[i];
+	struct statistic *stat = &ui->stat[i];
+	struct statistic_info *info = &ui->info[i];
 	struct statistic_discipline *disc = &statistic_discs[stat->type];
 	void *src, *dst;
 	size_t size;
@@ -326,12 +326,12 @@ static int __cpuinit statistic_hotcpu(st
 				      unsigned long action, void *__cpu)
 {
 	int cpu = (unsigned long)__cpu, i, retval = NOTIFY_OK;
-	struct statistic_interface *interface;
+	struct statistic_ui *ui;
 
 	mutex_lock(&statistic_list_mutex);
-	list_for_each_entry(interface, &statistic_list, list)
-		for (i = 0; i < interface->number; i++) {
-			retval = _statistic_hotcpu(interface, i, action, cpu);
+	list_for_each_entry(ui, &statistic_list, list)
+		for (i = 0; i < ui->number; i++) {
+			retval = _statistic_hotcpu(ui, i, action, cpu);
 			if (retval == NOTIFY_BAD)
 				goto unlock;
 		}
@@ -433,15 +433,14 @@ static match_table_t statistic_match_com
 	{9999, NULL}
 };
 
-static void statistic_parse_line(struct statistic_interface *interface,
-				 char *def)
+static void statistic_parse_line(struct statistic_ui *ui, char *def)
 {
 	char *name = NULL;
 	substring_t args[MAX_OPT_ARGS], sub;
 	int token, reset = 0, defaults = 0, i;
 	int state = STATISTIC_STATE_INVALID;
-	struct statistic *stat = interface->stat;
-	struct statistic_info *info = interface->info;
+	struct statistic *stat = ui->stat;
+	struct statistic_info *info = ui->info;
 
 	if (unlikely(!def))
 		return;
@@ -466,7 +465,7 @@ static void statistic_parse_line(struct 
 			break;
 		}
 	}
-	for (i = 0; i < interface->number; i++, stat++, info++) {
+	for (i = 0; i < ui->number; i++, stat++, info++) {
 		if (!name || (name && !strcmp(name, info->name))) {
 			if (defaults)
 				statistic_parse_match(stat, info, NULL);
@@ -484,10 +483,10 @@ static void statistic_parse_line(struct 
 /* sequential files comprising user interface */
 
 #define STATISTIC_LABEL_SIZE	128
-static void statistic_label(struct statistic_interface *interface, int i,
-			    void *key, struct seq_file *seq)
+static void statistic_label(struct statistic_ui *ui, int i, void *key,
+			    struct seq_file *seq)
 {
-	struct statistic_info *info = &interface->info[i];
+	struct statistic_info *info = &ui->info[i];
 	char *buf;
 
 	if (!(info->flags & STATISTIC_FLAGS_LABEL))
@@ -495,13 +494,13 @@ static void statistic_label(struct stati
 	buf = kzalloc(STATISTIC_LABEL_SIZE, GFP_ATOMIC);
 	if (!buf)
 		return;
-	interface->label(interface, i, key, buf, STATISTIC_LABEL_SIZE - 1);
+	ui->label(ui, i, key, buf, STATISTIC_LABEL_SIZE - 1);
 	seq_printf(seq, "%s", buf);
 	kfree(buf);
 }
 
 struct statistic_seq_private {
-	struct statistic_interface *interface;
+	struct statistic_ui *ui;
 	int i;
 	size_t w_offset;
 	char *w_buf;
@@ -512,7 +511,7 @@ static void *statistic_seq_traverse(stru
 				    struct statistic_seq_private *seq_priv)
 {
 	*pos += inc;
-	if (*pos >= seq_priv->interface->number)
+	if (*pos >= seq_priv->ui->number)
 		return NULL;
 	seq_priv->i = *pos;
 	return seq_priv;
@@ -543,9 +542,9 @@ static char *statistic_state_strings[] =
 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_ui *ui = seq_priv->ui;
+	struct statistic *stat = &ui->stat[seq_priv->i];
+	struct statistic_info *info = &ui->info[seq_priv->i];
 	struct statistic_discipline *disc = &statistic_discs[stat->type];
 	char t0[TIMESTAMP_SIZE], t1[TIMESTAMP_SIZE], t2[TIMESTAMP_SIZE];
 
@@ -584,7 +583,7 @@ static int statistic_seq_show_data(struc
 	struct statistic_discipline *disc = &statistic_discs[stat->type];
 
 	if (stat->state >= STATISTIC_STATE_OFF)
-		disc->data(stat, seq, seq_priv->interface, seq_priv->i);
+		disc->data(stat, seq, seq_priv->ui, seq_priv->i);
 	return 0;
 }
 
@@ -611,7 +610,7 @@ static int statistic_open_def(struct ino
 	seq_priv = kzalloc(sizeof(struct statistic_seq_private), GFP_KERNEL);
 	if (!seq_priv)
 		return -ENOMEM;
-	seq_priv->interface = inode->i_private;
+	seq_priv->ui = inode->i_private;
 	retval = seq_open(file, &statistic_seq_ops_def);
 	if (!retval) {
 		seq = file->private_data;
@@ -623,14 +622,14 @@ static int statistic_open_def(struct ino
 
 static int statistic_release_def(struct inode *inode, struct file *file)
 {
-	struct statistic_interface *interface = inode->i_private;
+	struct statistic_ui *ui = 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);
+			statistic_parse_line(ui, p);
 		kfree(seq_priv->w_buf);
 	}
 	return seq_release_private(inode, file);
@@ -674,31 +673,31 @@ static struct file_operations statistic_
 
 static int statistic_open_data(struct inode *inode, struct file *file)
 {
-	struct statistic_interface *interface = inode->i_private;
+	struct statistic_ui *ui = inode->i_private;
 	struct statistic *stat;
 	struct statistic_discipline *disc;
 	struct statistic_seq_private *seq_priv;
 	struct seq_file *seq;
 	int size, i, j, retval = -ENOMEM;
 
-	if (interface->pull)
-		interface->pull(interface);
+	if (ui->pull)
+		ui->pull(ui);
 
-	size = interface->number * sizeof(struct statistic);
+	size = ui->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->ui = ui;
 	seq_priv->stat = stat = kmalloc(size, GFP_KERNEL);
 	if (!stat)
 		goto failed_stat;
 
-	memcpy(stat, interface->stat, size);
-	for (i = 0; i < interface->number; i++) {
+	memcpy(stat, ui->stat, size);
+	for (i = 0; i < ui->number; i++) {
 		if (stat[i].state < STATISTIC_STATE_OFF)
 			continue;
-		stat[i].data = statistic_merge(interface, i);
+		stat[i].data = statistic_merge(ui, i);
 		if (!stat[i].data)
 			goto failed_merge;
 	}
@@ -731,12 +730,12 @@ static int statistic_release_data(struct
 {
 	struct seq_file *seq = file->private_data;
 	struct statistic_seq_private *seq_priv = seq->private;
-	struct statistic_interface *interface = seq_priv->interface;
+	struct statistic_ui *ui = seq_priv->ui;
 	struct statistic *stat = seq_priv->stat;
 	struct statistic_discipline *disc;
 	int i;
 
-	for (i = 0; i < interface->number; i++) {
+	for (i = 0; i < ui->number; i++) {
 		if (stat[i].state < STATISTIC_STATE_OFF)
 			continue;
 		disc = &statistic_discs[stat[i].type];
@@ -802,9 +801,9 @@ static void statistic_merge_counter(stru
 }
 
 static void statistic_data_counter(struct statistic *stat, struct seq_file *seq,
-				   struct statistic_interface *interface, int i)
+				   struct statistic_ui *ui, int i)
 {
-	struct statistic_info *info = &interface->info[i];
+	struct statistic_info *info = &ui->info[i];
 
 	seq_printf(seq, "%s %Lu\n",
 		   info->name, *(unsigned long long *)stat->data);
@@ -891,9 +890,9 @@ static int statistic_div(signed long lon
 }
 
 static void statistic_data_util(struct statistic *stat, struct seq_file *seq,
-				struct statistic_interface *interface, int i)
+				struct statistic_ui *ui, int i)
 {
-	struct statistic_info *info = &interface->info[i];
+	struct statistic_info *info = &ui->info[i];
 	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;
@@ -1008,20 +1007,18 @@ static void _statistic_data_histogram(st
 				      signed long long bound,
 				      unsigned long long hits,
 				      struct statistic_info *info,
-				      struct statistic_interface *interface,
-				      int i)
+				      struct statistic_ui *ui, int i)
 {
 	seq_printf(seq, "%s %s%Ld %Lu ", info->name, prefix, bound, hits);
-	statistic_label(interface, i, &bound, seq);
+	statistic_label(ui, i, &bound, seq);
 	seq_printf(seq, "\n");
 }
 
 static void statistic_data_histogram(struct statistic *stat,
 				     struct seq_file *seq,
-				     struct statistic_interface *interface,
-				     int i)
+				     struct statistic_ui *ui, int i)
 {
-	struct statistic_info *info = &interface->info[i];
+	struct statistic_info *info = &ui->info[i];
 	int j;
 	signed long long bound = 0;
 	unsigned long long hits = 0;
@@ -1029,10 +1026,9 @@ static void statistic_data_histogram(str
 	for (j = 0; j < (stat->u.histogram.last_index); j++) {
 		bound = statistic_histogram_calc_value(stat, j);
 		hits = ((u64*)stat->data)[j];
-		_statistic_data_histogram(seq, "<=", bound, hits, info,
-					  interface, i);
+		_statistic_data_histogram(seq, "<=", bound, hits, info, ui, i);
 	}
-	_statistic_data_histogram(seq, ">", bound, hits, info, interface, i);
+	_statistic_data_histogram(seq, ">", bound, hits, info, ui, i);
 }
 
 static void statistic_def_histogram(struct statistic *stat,
@@ -1218,14 +1214,12 @@ static void statistic_merge_sparse(struc
 }
 
 static void statistic_data_sparse(struct statistic *stat, struct seq_file *seq,
-				  struct statistic_interface *interface, int i)
+				  struct statistic_ui *ui, int i)
 {
-	struct statistic_info *info = &interface->info[i];
+	struct statistic_info *info = &ui->info[i];
 	struct statistic_sparse_list *slist = stat->data;
 	struct statistic_entry_sparse *entry;
 
-	seq_printf(seq, "%s missed 0x%Lu\n", info->name,
-		   (unsigned long long)slist->hits_missed);
 	list_for_each_entry(entry, &slist->entry_lh, list) {
 		seq_printf(seq, "%s ", info->name);
 		if (info->flags & _STATISTIC_FLAGS_KEY)
@@ -1234,9 +1228,11 @@ static void statistic_data_sparse(struct
 			seq_printf(seq, "0x%Lx ",
 				   *(signed long long *)entry->key);
 		seq_printf(seq, "%Lu ", (unsigned long long)entry->hits);
-		statistic_label(interface, i, entry->key, seq);
+		statistic_label(ui, i, entry->key, seq);
 		seq_printf(seq, "\n");
 	}
+	seq_printf(seq, "%s other %Lu\n", info->name,
+		   (unsigned long long)slist->hits_missed);
 }
 
 static void statistic_def_sparse(struct statistic *stat, struct seq_file *seq)
@@ -1337,51 +1333,48 @@ static struct statistic_discipline stati
 
 /**
  * statistic_create - setup statistics and create debugfs files
- * @interface: struct statistic_interface provided by client
+ * @ui: struct statistic_ui provided by client
  * @name: name of debugfs directory to be created
  *
  * Creates a debugfs directory in "statistics" as well as the "data" and
  * "definition" files. Then we attach setup statistics according to the
- * definition provided by client through struct statistic_interface.
+ * definition provided by client through struct statistic_ui.
  *
- * struct statistic_interface must have been set up prior to calling this.
+ * struct statistic_ui must have been set up prior to calling this.
  *
  * On success, 0 is returned.
  *
  * If some required memory could not be allocated, or the creation
  * of debugfs entries failed, this routine fails, and -ENOMEM is returned.
  */
-int statistic_create(struct statistic_interface *interface, const char *name)
+int statistic_create(struct statistic_ui *ui, const char *name)
 {
-	struct statistic *stat = interface->stat;
-	struct statistic_info *info = interface->info;
+	struct statistic *stat = ui->stat;
+	struct statistic_info *info = ui->info;
 	int i;
 
-	BUG_ON(!stat || !info || !interface->number);
+	BUG_ON(!stat || !info || !ui->number);
 
-	interface->debugfs_dir =
-		debugfs_create_dir(name, statistic_root_dir);
-	if (unlikely(!interface->debugfs_dir))
+	ui->dir = debugfs_create_dir(name, statistic_root_dir);
+	if (unlikely(!ui->dir))
 		return -ENOMEM;
 
-	interface->data_file = debugfs_create_file(
-		"data", S_IFREG | S_IRUSR, interface->debugfs_dir,
-		(void*)interface, &statistic_data_fops);
-	if (unlikely(!interface->data_file)) {
-		debugfs_remove(interface->debugfs_dir);
+	ui->data = debugfs_create_file("data", S_IFREG | S_IRUSR, ui->dir,
+				       (void*)ui, &statistic_data_fops);
+	if (unlikely(!ui->data)) {
+		debugfs_remove(ui->dir);
 		return -ENOMEM;
 	}
 
-	interface->def_file = debugfs_create_file(
-		"definition", S_IFREG | S_IRUSR | S_IWUSR,
-		interface->debugfs_dir, (void*)interface, &statistic_def_fops);
-	if (unlikely(!interface->def_file)) {
-		debugfs_remove(interface->data_file);
-		debugfs_remove(interface->debugfs_dir);
+	ui->def = debugfs_create_file("definition", S_IFREG | S_IRUSR | S_IWUSR,
+				      ui->dir, (void*)ui, &statistic_def_fops);
+	if (unlikely(!ui->def)) {
+		debugfs_remove(ui->data);
+		debugfs_remove(ui->dir);
 		return -ENOMEM;
 	}
 
-	for (i = 0; i < interface->number; i++, stat++, info++) {
+	for (i = 0; i < ui->number; i++, stat++, info++) {
 		if (info->flags & _STATISTIC_FLAGS_KEY)
 			stat->key_size = info->key_size;
 		else
@@ -1391,7 +1384,7 @@ int statistic_create(struct statistic_in
 	}
 
 	mutex_lock(&statistic_list_mutex);
-	list_add(&interface->list, &statistic_list);
+	list_add(&ui->list, &statistic_list);
 	mutex_unlock(&statistic_list_mutex);
 	return 0;
 }
@@ -1399,7 +1392,7 @@ EXPORT_SYMBOL_GPL(statistic_create);
 
 /**
  * statistic_remove - remove unused statistics
- * @interface: struct statistic_interface to clean up
+ * @ui: struct statistic_ui to clean up
  *
  * Remove a debugfs directory in "statistics" along with its "data" and
  * "definition" files. Removing this user interface also causes the removal
@@ -1409,23 +1402,23 @@ EXPORT_SYMBOL_GPL(statistic_create);
  *
  * Returns -EINVAL for attempted double removal, 0 otherwise.
  */
-int statistic_remove(struct statistic_interface *interface)
+int statistic_remove(struct statistic_ui *ui)
 {
-	struct statistic *stat = interface->stat;
-	struct statistic_info *info = interface->info;
+	struct statistic *stat = ui->stat;
+	struct statistic_info *info = ui->info;
 	int i;
 
-	if (unlikely(!interface->debugfs_dir))
+	if (unlikely(!ui->dir))
 		return -EINVAL;
 	mutex_lock(&statistic_list_mutex);
-	list_del(&interface->list);
+	list_del(&ui->list);
 	mutex_unlock(&statistic_list_mutex);
-	for (i = 0; i < interface->number; i++, stat++, info++)
+	for (i = 0; i < ui->number; i++, stat++, info++)
 		statistic_transition(stat, info, STATISTIC_STATE_INVALID);
-	debugfs_remove(interface->data_file);
-	debugfs_remove(interface->def_file);
-	debugfs_remove(interface->debugfs_dir);
-	interface->debugfs_dir = NULL;
+	debugfs_remove(ui->data);
+	debugfs_remove(ui->def);
+	debugfs_remove(ui->dir);
+	ui->dir = NULL;
 	return 0;
 }
 EXPORT_SYMBOL_GPL(statistic_remove);
Index: linux/drivers/s390/scsi/zfcp_def.h
===================================================================
--- linux.orig/drivers/s390/scsi/zfcp_def.h
+++ linux/drivers/s390/scsi/zfcp_def.h
@@ -942,7 +942,7 @@ struct zfcp_adapter {
 	struct fc_host_statistics *fc_stats;
 	struct fsf_qtcb_bottom_port *stats_reset_data;
 	unsigned long		stats_reset;
-	struct statistic_interface stat_if;
+	struct statistic_ui stat_if;
 	struct statistic stat[_ZFCP_STAT_A_NUMBER];
 };
 
@@ -1006,7 +1006,7 @@ struct zfcp_unit {
 						  all scsi_scan_target
 						  requests have been
 						  completed. */
-	struct statistic_interface stat_if;
+	struct statistic_ui stat_if;
 	struct statistic stat[_ZFCP_STAT_U_NUMBER];
 };
 


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux