Messages in this thread Patch in this message | | | Date | Tue, 11 Jul 2017 16:32:37 +0200 | From | Jessica Yu <> | Subject | Re: module: fix ddebug_remove_module() |
| |
+++ Zhou Chengming [07/07/17 11:15 +0800]: >ddebug_remove_module() use mod->name to find the ddebug_table of the >module and remove it. But dynamic_debug_setup() use the first >_ddebug->modname to create ddebug_table for the module. It's ok when >the _ddebug->modname is the same with the mod->name. > >But livepatch module is special, it may contain _ddebugs of other >modules, the modname of which is different from the name of livepatch >module. So ddebug_remove_module() can't use mod->name to find the
s/mod->name/_ddebug->modname/ :) I'll fix the typo in the changelog.
>right ddebug_table and remove it. It can cause kernel crash when we cat >the file <debugfs>/dynamic_debug/control. > >Signed-off-by: Zhou Chengming <zhouchengming1@huawei.com>
Makes sense, I have this queued up to be applied to modules-next.
By the way, although I can see how livepatch modules can end up including a hodgepodge of _ddebug entries from different modules, wouldn't the correct thing to do be to have the modname of the livepatch module instead of the modules they originally came from? I think when the pr_debug's are enabled it'll print the name of the original module instead of the livepatch module.
Jessica
> kernel/module.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > >diff --git a/kernel/module.c b/kernel/module.c >index 4a3665f..dac9805 100644 >--- a/kernel/module.c >+++ b/kernel/module.c >@@ -2703,21 +2703,21 @@ static void add_kallsyms(struct module *mod, const struct load_info *info) > } > #endif /* CONFIG_KALLSYMS */ > >-static void dynamic_debug_setup(struct _ddebug *debug, unsigned int num) >+static void dynamic_debug_setup(struct module *mod, struct _ddebug *debug, unsigned int num) > { > if (!debug) > return; > #ifdef CONFIG_DYNAMIC_DEBUG >- if (ddebug_add_module(debug, num, debug->modname)) >+ if (ddebug_add_module(debug, num, mod->name)) > pr_err("dynamic debug error adding module: %s\n", > debug->modname); > #endif > } > >-static void dynamic_debug_remove(struct _ddebug *debug) >+static void dynamic_debug_remove(struct module *mod, struct _ddebug *debug) > { > if (debug) >- ddebug_remove_module(debug->modname); >+ ddebug_remove_module(mod->name); > } > > void * __weak module_alloc(unsigned long size) >@@ -3697,7 +3697,7 @@ static int load_module(struct load_info *info, const char __user *uargs, > goto free_arch_cleanup; > } > >- dynamic_debug_setup(info->debug, info->num_debug); >+ dynamic_debug_setup(mod, info->debug, info->num_debug); > > /* Ftrace init must be called in the MODULE_STATE_UNFORMED state */ > ftrace_module_init(mod); >@@ -3761,7 +3761,7 @@ static int load_module(struct load_info *info, const char __user *uargs, > module_disable_nx(mod); > > ddebug_cleanup: >- dynamic_debug_remove(info->debug); >+ dynamic_debug_remove(mod, info->debug); > synchronize_sched(); > kfree(mod->args); > free_arch_cleanup: >-- >1.8.3.1 >
| |