Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755096AbbFBCwY (ORCPT ); Mon, 1 Jun 2015 22:52:24 -0400 Received: from mail-oi0-f50.google.com ([209.85.218.50]:35016 "EHLO mail-oi0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750924AbbFBCwR (ORCPT ); Mon, 1 Jun 2015 22:52:17 -0400 MIME-Version: 1.0 In-Reply-To: <1433173717-20885-1-git-send-email-mbenes@suse.cz> References: <1433173717-20885-1-git-send-email-mbenes@suse.cz> Date: Tue, 2 Jun 2015 10:52:16 +0800 Message-ID: Subject: Re: [PATCH] livepatch: add module locking around kallsyms calls From: Minfei Huang To: Miroslav Benes Cc: Josh Poimboeuf , "sjenning@redhat.com" , Jiri Kosina , =?UTF-8?B?Vm9qdMSbY2ggUGF2bMOtaw==?= , "live-patching@vger.kernel.org" , "linux-kernel@vger.kernel.org" , pmladek@suse.cz Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2827 Lines: 79 On Mon, Jun 1, 2015 at 11:48 PM, Miroslav Benes wrote: > The list of loaded modules is walked through in > module_kallsyms_on_each_symbol (called by kallsyms_on_each_symbol). The > module_mutex lock should be acquired to prevent potential corruptions > in the list. > > This was uncovered with new lockdep asserts in module code introduced by > the commit 0be964be0d45 ("module: Sanitize RCU usage and locking") in > recent next- trees. > > Signed-off-by: Miroslav Benes > --- > kernel/livepatch/core.c | 18 +++++++++++++----- > 1 file changed, 13 insertions(+), 5 deletions(-) > > diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c > index e6c8d54..c40ebcc 100644 > --- a/kernel/livepatch/core.c > +++ b/kernel/livepatch/core.c > @@ -179,7 +179,9 @@ static int klp_find_object_symbol(const char *objname, const char *name, > .count = 0 > }; > > + mutex_lock(&module_mutex); > kallsyms_on_each_symbol(klp_find_callback, &args); > + mutex_unlock(&module_mutex); > > if (args.count == 0) > pr_err("symbol '%s' not found in symbol table\n", name); > @@ -219,13 +221,19 @@ static int klp_verify_vmlinux_symbol(const char *name, unsigned long addr) > .name = name, > .addr = addr, > }; > + int ret; > > - if (kallsyms_on_each_symbol(klp_verify_callback, &args)) > - return 0; > + mutex_lock(&module_mutex); > + ret = kallsyms_on_each_symbol(klp_verify_callback, &args); > + mutex_unlock(&module_mutex); > Hi. In livepatch code path, returning value 0 may represent the right, but sometime represent wrong, like the above function. Is it possible that we can wrap such function and return the unified value? Thus we can not confuse the returning value any more. Otherwise annotation is appreciate. Thanks Minfei > - pr_err("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n", > - name, addr); > - return -EINVAL; > + if (!ret) { > + pr_err("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n", > + name, addr); > + return -EINVAL; > + } > + > + return 0; > } > > static int klp_find_verify_func_addr(struct klp_object *obj, > -- > 2.1.4 > > -- > To unsubscribe from this list: send the line "unsubscribe live-patching" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/