dect
/
linux-2.6
Archived
13
0
Fork 0

dynamic_debug: add modname arg to exec_query callchain

Pass module name into ddebug_exec_queries(), ddebug_exec_query(), and
ddebug_parse_query() as separate parameter.  In ddebug_parse_query(),
the module name is added into the query struct before the query-string
is parsed.  This allows the query-string to be shorter:

instead of:
   $modname.dyndbg="module $modname +fp"
do this:
   $modname.dyndbg="+fp"

Omitting "module $modname" from the query string is actually required
for $modname.dyndbg rules; the set-only-once check added in a previous
patch will throw an error if its added again.  ddebug_query="..." has
no $modname associated with it, so the query string may include it.

This also fixes redundant "module $modname" otherwise needed to handle
multiple queries per string:

   $modname.dyndbg="func foo +fp; func bar +fp"

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Acked-by: Jason Baron <jbaron@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Jim Cromie 2012-04-27 14:30:40 -06:00 committed by Greg Kroah-Hartman
parent 4107692760
commit 8e59b5cfb9
1 changed files with 13 additions and 8 deletions

View File

@ -338,7 +338,7 @@ static int check_set(const char **dest, char *src, char *name)
* Returns 0 on success, <0 on error. * Returns 0 on success, <0 on error.
*/ */
static int ddebug_parse_query(char *words[], int nwords, static int ddebug_parse_query(char *words[], int nwords,
struct ddebug_query *query) struct ddebug_query *query, const char *modname)
{ {
unsigned int i; unsigned int i;
int rc; int rc;
@ -348,6 +348,10 @@ static int ddebug_parse_query(char *words[], int nwords,
return -EINVAL; return -EINVAL;
memset(query, 0, sizeof(*query)); memset(query, 0, sizeof(*query));
if (modname)
/* support $modname.dyndbg=<multiple queries> */
query->module = modname;
for (i = 0 ; i < nwords ; i += 2) { for (i = 0 ; i < nwords ; i += 2) {
if (!strcmp(words[i], "func")) if (!strcmp(words[i], "func"))
rc = check_set(&query->function, words[i+1], "func"); rc = check_set(&query->function, words[i+1], "func");
@ -444,7 +448,7 @@ static int ddebug_parse_flags(const char *str, unsigned int *flagsp,
return 0; return 0;
} }
static int ddebug_exec_query(char *query_string) static int ddebug_exec_query(char *query_string, const char *modname)
{ {
unsigned int flags = 0, mask = 0; unsigned int flags = 0, mask = 0;
struct ddebug_query query; struct ddebug_query query;
@ -455,7 +459,7 @@ static int ddebug_exec_query(char *query_string)
nwords = ddebug_tokenize(query_string, words, MAXWORDS); nwords = ddebug_tokenize(query_string, words, MAXWORDS);
if (nwords <= 0) if (nwords <= 0)
return -EINVAL; return -EINVAL;
if (ddebug_parse_query(words, nwords-1, &query)) if (ddebug_parse_query(words, nwords-1, &query, modname))
return -EINVAL; return -EINVAL;
if (ddebug_parse_flags(words[nwords-1], &flags, &mask)) if (ddebug_parse_flags(words[nwords-1], &flags, &mask))
return -EINVAL; return -EINVAL;
@ -471,7 +475,7 @@ static int ddebug_exec_query(char *query_string)
last error or number of matching callsites. Module name is either last error or number of matching callsites. Module name is either
in param (for boot arg) or perhaps in query string. in param (for boot arg) or perhaps in query string.
*/ */
static int ddebug_exec_queries(char *query) static int ddebug_exec_queries(char *query, const char *modname)
{ {
char *split; char *split;
int i, errs = 0, exitcode = 0, rc, nfound = 0; int i, errs = 0, exitcode = 0, rc, nfound = 0;
@ -487,7 +491,7 @@ static int ddebug_exec_queries(char *query)
vpr_info("query %d: \"%s\"\n", i, query); vpr_info("query %d: \"%s\"\n", i, query);
rc = ddebug_exec_query(query); rc = ddebug_exec_query(query, modname);
if (rc < 0) { if (rc < 0) {
errs++; errs++;
exitcode = rc; exitcode = rc;
@ -652,7 +656,7 @@ static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf,
tmpbuf[len] = '\0'; tmpbuf[len] = '\0';
vpr_info("read %d bytes from userspace\n", (int)len); vpr_info("read %d bytes from userspace\n", (int)len);
ret = ddebug_exec_queries(tmpbuf); ret = ddebug_exec_queries(tmpbuf, NULL);
kfree(tmpbuf); kfree(tmpbuf);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -878,7 +882,8 @@ static int ddebug_dyndbg_param_cb(char *param, char *val,
if (strcmp(param, "dyndbg")) if (strcmp(param, "dyndbg"))
return on_err; /* determined by caller */ return on_err; /* determined by caller */
ddebug_exec_queries(val ? val : "+p"); ddebug_exec_queries((val ? val : "+p"), modname);
return 0; /* query failure shouldnt stop module load */ return 0; /* query failure shouldnt stop module load */
} }
@ -1011,7 +1016,7 @@ static int __init dynamic_debug_init(void)
if (ddebug_setup_string[0] != '\0') { if (ddebug_setup_string[0] != '\0') {
pr_warn("ddebug_query param name is deprecated," pr_warn("ddebug_query param name is deprecated,"
" change it to dyndbg\n"); " change it to dyndbg\n");
ret = ddebug_exec_queries(ddebug_setup_string); ret = ddebug_exec_queries(ddebug_setup_string, NULL);
if (ret < 0) if (ret < 0)
pr_warn("Invalid ddebug boot param %s", pr_warn("Invalid ddebug boot param %s",
ddebug_setup_string); ddebug_setup_string);