diff options
Diffstat (limited to 'lib/dynamic_debug.c')
| -rw-r--r-- | lib/dynamic_debug.c | 173 | 
1 files changed, 119 insertions, 54 deletions
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 79fc20b65e7..dcdade39e47 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -10,6 +10,8 @@   * Copyright (C) 2011 Bart Van Assche.  All Rights Reserved.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ +  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/moduleparam.h> @@ -29,6 +31,8 @@  #include <linux/jump_label.h>  #include <linux/hardirq.h>  #include <linux/sched.h> +#include <linux/device.h> +#include <linux/netdevice.h>  extern struct _ddebug __start___verbose[];  extern struct _ddebug __stop___verbose[]; @@ -37,7 +41,6 @@ struct ddebug_table {  	struct list_head link;  	char *mod_name;  	unsigned int num_ddebugs; -	unsigned int num_enabled;  	struct _ddebug *ddebugs;  }; @@ -147,19 +150,13 @@ static void ddebug_change(const struct ddebug_query *query,  			newflags = (dp->flags & mask) | flags;  			if (newflags == dp->flags)  				continue; - -			if (!newflags) -				dt->num_enabled--; -			else if (!dp->flags) -				dt->num_enabled++;  			dp->flags = newflags;  			if (newflags)  				dp->enabled = 1;  			else  				dp->enabled = 0;  			if (verbose) -				printk(KERN_INFO -					"ddebug: changed %s:%d [%s]%s %s\n", +				pr_info("changed %s:%d [%s]%s %s\n",  					dp->filename, dp->lineno,  					dt->mod_name, dp->function,  					ddebug_describe_flags(dp, flagbuf, @@ -169,7 +166,7 @@ static void ddebug_change(const struct ddebug_query *query,  	mutex_unlock(&ddebug_lock);  	if (!nfound && verbose) -		printk(KERN_INFO "ddebug: no matches for query\n"); +		pr_info("no matches for query\n");  }  /* @@ -214,10 +211,10 @@ static int ddebug_tokenize(char *buf, char *words[], int maxwords)  	if (verbose) {  		int i; -		printk(KERN_INFO "%s: split into words:", __func__); +		pr_info("split into words:");  		for (i = 0 ; i < nwords ; i++) -			printk(" \"%s\"", words[i]); -		printk("\n"); +			pr_cont(" \"%s\"", words[i]); +		pr_cont("\n");  	}  	return nwords; @@ -329,16 +326,15 @@ static int ddebug_parse_query(char *words[], int nwords,  			}  		} else {  			if (verbose) -				printk(KERN_ERR "%s: unknown keyword \"%s\"\n", -					__func__, words[i]); +				pr_err("unknown keyword \"%s\"\n", words[i]);  			return -EINVAL;  		}  	}  	if (verbose) -		printk(KERN_INFO "%s: q->function=\"%s\" q->filename=\"%s\" " -		       "q->module=\"%s\" q->format=\"%s\" q->lineno=%u-%u\n", -			__func__, query->function, query->filename, +		pr_info("q->function=\"%s\" q->filename=\"%s\" " +			"q->module=\"%s\" q->format=\"%s\" q->lineno=%u-%u\n", +			query->function, query->filename,  			query->module, query->format, query->first_lineno,  			query->last_lineno); @@ -367,7 +363,7 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp,  		return -EINVAL;  	}  	if (verbose) -		printk(KERN_INFO "%s: op='%c'\n", __func__, op); +		pr_info("op='%c'\n", op);  	for ( ; *str ; ++str) {  		for (i = ARRAY_SIZE(opt_array) - 1; i >= 0; i--) { @@ -382,7 +378,7 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp,  	if (flags == 0)  		return -EINVAL;  	if (verbose) -		printk(KERN_INFO "%s: flags=0x%x\n", __func__, flags); +		pr_info("flags=0x%x\n", flags);  	/* calculate final *flagsp, *maskp according to mask and op */  	switch (op) { @@ -400,8 +396,7 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp,  		break;  	}  	if (verbose) -		printk(KERN_INFO "%s: *flagsp=0x%x *maskp=0x%x\n", -			__func__, *flagsp, *maskp); +		pr_info("*flagsp=0x%x *maskp=0x%x\n", *flagsp, *maskp);  	return 0;  } @@ -426,40 +421,117 @@ static int ddebug_exec_query(char *query_string)  	return 0;  } +#define PREFIX_SIZE 64 + +static int remaining(int wrote) +{ +	if (PREFIX_SIZE - wrote > 0) +		return PREFIX_SIZE - wrote; +	return 0; +} + +static char *dynamic_emit_prefix(const struct _ddebug *desc, char *buf) +{ +	int pos_after_tid; +	int pos = 0; + +	pos += snprintf(buf + pos, remaining(pos), "%s", KERN_DEBUG); +	if (desc->flags & _DPRINTK_FLAGS_INCL_TID) { +		if (in_interrupt()) +			pos += snprintf(buf + pos, remaining(pos), "%s ", +						"<intr>"); +		else +			pos += snprintf(buf + pos, remaining(pos), "[%d] ", +						task_pid_vnr(current)); +	} +	pos_after_tid = pos; +	if (desc->flags & _DPRINTK_FLAGS_INCL_MODNAME) +		pos += snprintf(buf + pos, remaining(pos), "%s:", +					desc->modname); +	if (desc->flags & _DPRINTK_FLAGS_INCL_FUNCNAME) +		pos += snprintf(buf + pos, remaining(pos), "%s:", +					desc->function); +	if (desc->flags & _DPRINTK_FLAGS_INCL_LINENO) +		pos += snprintf(buf + pos, remaining(pos), "%d:", desc->lineno); +	if (pos - pos_after_tid) +		pos += snprintf(buf + pos, remaining(pos), " "); +	if (pos >= PREFIX_SIZE) +		buf[PREFIX_SIZE - 1] = '\0'; + +	return buf; +} +  int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...)  {  	va_list args;  	int res; +	struct va_format vaf; +	char buf[PREFIX_SIZE];  	BUG_ON(!descriptor);  	BUG_ON(!fmt);  	va_start(args, fmt); -	res = printk(KERN_DEBUG); -	if (descriptor->flags & _DPRINTK_FLAGS_INCL_TID) { -		if (in_interrupt()) -			res += printk(KERN_CONT "<intr> "); -		else -			res += printk(KERN_CONT "[%d] ", task_pid_vnr(current)); -	} -	if (descriptor->flags & _DPRINTK_FLAGS_INCL_MODNAME) -		res += printk(KERN_CONT "%s:", descriptor->modname); -	if (descriptor->flags & _DPRINTK_FLAGS_INCL_FUNCNAME) -		res += printk(KERN_CONT "%s:", descriptor->function); -	if (descriptor->flags & _DPRINTK_FLAGS_INCL_LINENO) -		res += printk(KERN_CONT "%d ", descriptor->lineno); -	res += vprintk(fmt, args); +	vaf.fmt = fmt; +	vaf.va = &args; +	res = printk("%s%pV", dynamic_emit_prefix(descriptor, buf), &vaf);  	va_end(args);  	return res;  }  EXPORT_SYMBOL(__dynamic_pr_debug); +int __dynamic_dev_dbg(struct _ddebug *descriptor, +		      const struct device *dev, const char *fmt, ...) +{ +	struct va_format vaf; +	va_list args; +	int res; +	char buf[PREFIX_SIZE]; + +	BUG_ON(!descriptor); +	BUG_ON(!fmt); + +	va_start(args, fmt); +	vaf.fmt = fmt; +	vaf.va = &args; +	res = __dev_printk(dynamic_emit_prefix(descriptor, buf), dev, &vaf); +	va_end(args); + +	return res; +} +EXPORT_SYMBOL(__dynamic_dev_dbg); + +#ifdef CONFIG_NET + +int __dynamic_netdev_dbg(struct _ddebug *descriptor, +		      const struct net_device *dev, const char *fmt, ...) +{ +	struct va_format vaf; +	va_list args; +	int res; +	char buf[PREFIX_SIZE]; + +	BUG_ON(!descriptor); +	BUG_ON(!fmt); + +	va_start(args, fmt); +	vaf.fmt = fmt; +	vaf.va = &args; +	res = __netdev_printk(dynamic_emit_prefix(descriptor, buf), dev, &vaf); +	va_end(args); + +	return res; +} +EXPORT_SYMBOL(__dynamic_netdev_dbg); + +#endif +  static __initdata char ddebug_setup_string[1024];  static __init int ddebug_setup_query(char *str)  {  	if (strlen(str) >= 1024) { -		pr_warning("ddebug boot param string too large\n"); +		pr_warn("ddebug boot param string too large\n");  		return 0;  	}  	strcpy(ddebug_setup_string, str); @@ -487,8 +559,7 @@ static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf,  		return -EFAULT;  	tmpbuf[len] = '\0';  	if (verbose) -		printk(KERN_INFO "%s: read %d bytes from userspace\n", -			__func__, (int)len); +		pr_info("read %d bytes from userspace\n", (int)len);  	ret = ddebug_exec_query(tmpbuf);  	if (ret) @@ -551,8 +622,7 @@ static void *ddebug_proc_start(struct seq_file *m, loff_t *pos)  	int n = *pos;  	if (verbose) -		printk(KERN_INFO "%s: called m=%p *pos=%lld\n", -			__func__, m, (unsigned long long)*pos); +		pr_info("called m=%p *pos=%lld\n", m, (unsigned long long)*pos);  	mutex_lock(&ddebug_lock); @@ -577,8 +647,8 @@ static void *ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos)  	struct _ddebug *dp;  	if (verbose) -		printk(KERN_INFO "%s: called m=%p p=%p *pos=%lld\n", -			__func__, m, p, (unsigned long long)*pos); +		pr_info("called m=%p p=%p *pos=%lld\n", +			m, p, (unsigned long long)*pos);  	if (p == SEQ_START_TOKEN)  		dp = ddebug_iter_first(iter); @@ -601,8 +671,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)  	char flagsbuf[8];  	if (verbose) -		printk(KERN_INFO "%s: called m=%p p=%p\n", -			__func__, m, p); +		pr_info("called m=%p p=%p\n", m, p);  	if (p == SEQ_START_TOKEN) {  		seq_puts(m, @@ -627,8 +696,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)  static void ddebug_proc_stop(struct seq_file *m, void *p)  {  	if (verbose) -		printk(KERN_INFO "%s: called m=%p p=%p\n", -			__func__, m, p); +		pr_info("called m=%p p=%p\n", m, p);  	mutex_unlock(&ddebug_lock);  } @@ -651,7 +719,7 @@ static int ddebug_proc_open(struct inode *inode, struct file *file)  	int err;  	if (verbose) -		printk(KERN_INFO "%s: called\n", __func__); +		pr_info("called\n");  	iter = kzalloc(sizeof(*iter), GFP_KERNEL);  	if (iter == NULL) @@ -695,7 +763,6 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n,  	}  	dt->mod_name = new_name;  	dt->num_ddebugs = n; -	dt->num_enabled = 0;  	dt->ddebugs = tab;  	mutex_lock(&ddebug_lock); @@ -703,8 +770,7 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n,  	mutex_unlock(&ddebug_lock);  	if (verbose) -		printk(KERN_INFO "%u debug prints in module %s\n", -				 n, dt->mod_name); +		pr_info("%u debug prints in module %s\n", n, dt->mod_name);  	return 0;  }  EXPORT_SYMBOL_GPL(ddebug_add_module); @@ -726,8 +792,7 @@ int ddebug_remove_module(const char *mod_name)  	int ret = -ENOENT;  	if (verbose) -		printk(KERN_INFO "%s: removing module \"%s\"\n", -				__func__, mod_name); +		pr_info("removing module \"%s\"\n", mod_name);  	mutex_lock(&ddebug_lock);  	list_for_each_entry_safe(dt, nextdt, &ddebug_tables, link) { @@ -803,8 +868,8 @@ static int __init dynamic_debug_init(void)  	if (ddebug_setup_string[0] != '\0') {  		ret = ddebug_exec_query(ddebug_setup_string);  		if (ret) -			pr_warning("Invalid ddebug boot param %s", -				   ddebug_setup_string); +			pr_warn("Invalid ddebug boot param %s", +				ddebug_setup_string);  		else  			pr_info("ddebug initialized with string %s",  				ddebug_setup_string);  |