summaryrefslogtreecommitdiff
path: root/lib/dynamic_debug.c
diff options
context:
space:
mode:
authorJim Cromie <jim.cromie@gmail.com>2012-04-27 14:30:37 -0600
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-04-30 16:24:34 -0400
commit6ab676e96422f33a873006096f928feeded7ce3b (patch)
treedbb5ae0912831f528db8cd654ca96a294a5afb33 /lib/dynamic_debug.c
parentf0b919d967284313be4a767ba92ab5a88cb27410 (diff)
downloadlwn-6ab676e96422f33a873006096f928feeded7ce3b.tar.gz
lwn-6ab676e96422f33a873006096f928feeded7ce3b.zip
dynamic_debug: combine parse_args callbacks together
Refactor ddebug_dyndbg_boot_param_cb and ddebug_dyndbg_module_param_cb into a common helper function, and call it from both. The handling of foo.dyndbg is unneeded by the latter, but harmless. The 2 callers differ only by pr_info and the return code they pass to the helper for when an unknown param is handled. I could slightly reduce dmesg clutter by putting the vpr_info in the common helper, after the return on_err, but that loses __func__ context, is overly silent on module_cb unknown param errors, and the clutter is only when dynamic_debug.verbose=1 anyway. 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>
Diffstat (limited to 'lib/dynamic_debug.c')
-rw-r--r--lib/dynamic_debug.c36
1 files changed, 20 insertions, 16 deletions
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 09f2cda88058..3b06f926d5b8 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -862,39 +862,43 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n,
}
EXPORT_SYMBOL_GPL(ddebug_add_module);
-/* handle both dyndbg=".." and $module.dyndbg=".." params at boot */
-static int ddebug_dyndbg_boot_param_cb(char *param, char *val,
- const char *unused)
+/* helper for ddebug_dyndbg_(boot|module)_param_cb */
+static int ddebug_dyndbg_param_cb(char *param, char *val,
+ const char *modname, int on_err)
{
- const char *modname = NULL;
char *sep;
sep = strchr(param, '.');
if (sep) {
+ /* needed only for ddebug_dyndbg_boot_param_cb */
*sep = '\0';
modname = param;
param = sep + 1;
}
if (strcmp(param, "dyndbg"))
- return 0; /* skip all other params w/o error */
-
- vpr_info("module: %s %s=\"%s\"\n", modname, param, val);
+ return on_err; /* determined by caller */
ddebug_exec_queries(val ? val : "+p");
return 0; /* query failure shouldnt stop module load */
}
-/* handle dyndbg args to modprobe */
-int ddebug_dyndbg_module_param_cb(char *param, char *val, const char *doing)
+/* handle both dyndbg and $module.dyndbg params at boot */
+static int ddebug_dyndbg_boot_param_cb(char *param, char *val,
+ const char *unused)
{
- if (strcmp(param, "dyndbg"))
- return -ENOENT;
-
- vpr_info("module: %s %s=\"%s\"\n", doing, param, val);
-
- ddebug_exec_queries((val ? val : "+p"));
+ vpr_info("%s=\"%s\"\n", param, val);
+ return ddebug_dyndbg_param_cb(param, val, NULL, 0);
+}
- return 0; /* query failure shouldnt stop module load */
+/*
+ * modprobe foo finds foo.params in boot-args, strips "foo.", and
+ * passes them to load_module(). This callback gets unknown params,
+ * processes dyndbg params, rejects others.
+ */
+int ddebug_dyndbg_module_param_cb(char *param, char *val, const char *module)
+{
+ vpr_info("module: %s %s=\"%s\"\n", module, param, val);
+ return ddebug_dyndbg_param_cb(param, val, module, -ENOENT);
}
static void ddebug_table_free(struct ddebug_table *dt)