Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932938AbdGKOcq (ORCPT ); Tue, 11 Jul 2017 10:32:46 -0400 Received: from mail.kernel.org ([198.145.29.99]:38090 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755310AbdGKOcp (ORCPT ); Tue, 11 Jul 2017 10:32:45 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 33D3422C96 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=jeyu@kernel.org Date: Tue, 11 Jul 2017 16:32:37 +0200 From: Jessica Yu To: Zhou Chengming Cc: rusty@rustcorp.com.au, jpoimboe@redhat.com, linux-kernel@vger.kernel.org, huawei.libin@huawei.com Subject: Re: module: fix ddebug_remove_module() Message-ID: <20170711143235.lorte6hxa6xeqsfs@redbean> References: <1499397358-91778-1-git-send-email-zhouchengming1@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <1499397358-91778-1-git-send-email-zhouchengming1@huawei.com> X-OS: Linux redbean 4.12.0-rc2+ x86_64 User-Agent: NeoMutt/20170609 (1.8.3) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2926 Lines: 82 +++ 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 /dynamic_debug/control. > >Signed-off-by: Zhou Chengming 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 >