Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp9146491ybl; Fri, 17 Jan 2020 07:05:53 -0800 (PST) X-Google-Smtp-Source: APXvYqx6aYDTprBNveqhO3gpH/sqEu88A9dPIKVPM0Znes351m+HrT8BzHZzbxPoo4dyLKJDSgi4 X-Received: by 2002:a9d:6505:: with SMTP id i5mr6059595otl.121.1579273553485; Fri, 17 Jan 2020 07:05:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579273553; cv=none; d=google.com; s=arc-20160816; b=nw7oEpjwWhsk3rgtX0TbqppGnSF661o6eNCFcIK1CGq8PU3ymKQKDs5+SqHFz8lLQk +BsQnU5mHGeU94P/eTu1+zFXdFgY8/ks2HLEDGDQeRjEdvQFlZy6FCcH/9Dmen3a1FzI pu3L5xrVTmQplispbiHPWbAy1tZPQVdOLkwE3lo/3mUhmAa625PSZcwcPmI96Qp1Jzi+ zN81xAo8lYFHkMbVeziKRRtMMqGpsG30lrmjYOdzbjqom4q/3A1yhHtxuMoPiEXE75+i QDIUTZU//icrVG+ci42nEjC5RSc2TMJAWUA/EpYyQKGTwUduf/MuQU4Xsooc1ybGr3Fv cetQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=Ofs+rnAZXBGgshOG2nhpqlpjUMePQiRXIoQtZ1lpezQ=; b=wOS6v5BRoa7WUDPZ/tUerileM+Q7a5X3HS0jLtRD/3Xr4WNoJmFev8XB0GqY1F6mWP Fo5ZEve5bjeuCkG8KkI2dITvYkV1iCWAqLbB21z3orM95nx9DBVfgCryuxvKl/cjhD5a 0d3K3N59RH4LryK7COYv5Yg7yujQTweza0PFeglLO4mF4guq/Z0Xhi7brZP+D48Fw0AT jQ3woRSfBl4/2QOTsA8BgL4vMEqb7MVZN96kFkVT1DZskJ+2JReiDp7llVVV2bWCbtWp jBSJBUW+1hlbvECO6zVx9Q7tGU3kxWVkb5zHBQzs2XPVi4DUOQnkTzay8HKMcR7U2tC5 40Qw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r6si15018326otn.216.2020.01.17.07.05.41; Fri, 17 Jan 2020 07:05:53 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729236AbgAQPEI (ORCPT + 99 others); Fri, 17 Jan 2020 10:04:08 -0500 Received: from mx2.suse.de ([195.135.220.15]:46524 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729157AbgAQPED (ORCPT ); Fri, 17 Jan 2020 10:04:03 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 1CE80BBB7; Fri, 17 Jan 2020 15:04:02 +0000 (UTC) From: Petr Mladek To: Jiri Kosina , Josh Poimboeuf , Miroslav Benes Cc: Joe Lawrence , Kamalesh Babulal , Nicolai Stange , live-patching@vger.kernel.org, linux-kernel@vger.kernel.org, Petr Mladek Subject: [POC 18/23] module: Refactor add_unformed_module() Date: Fri, 17 Jan 2020 16:03:18 +0100 Message-Id: <20200117150323.21801-19-pmladek@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20200117150323.21801-1-pmladek@suse.com> References: <20200117150323.21801-1-pmladek@suse.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The livepatching code will need to add another condition to avoid waiting. Let's make the code slightly less hairy. Of course, it is a matter of taste. The main ideas of refactoring: + Make it clear what happens when old->state == MODULE_STATE_LIVE. + Make it more clear when we are leaving the function immediately and when we are doing some extra actions. + Be able to add another check that has to be done outside module_mutex and can result into an immediate return. Signed-off-by: Petr Mladek --- kernel/module.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/kernel/module.c b/kernel/module.c index b3f11524f8f9..ac45d465ff23 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3721,28 +3721,30 @@ static int add_unformed_module(struct module *mod) again: mutex_lock(&module_mutex); old = find_module_all(mod->name, strlen(mod->name), true); + if (old != NULL) { - if (old->state != MODULE_STATE_LIVE) { - /* Wait in case it fails to load. */ + if (old->state == MODULE_STATE_LIVE) { mutex_unlock(&module_mutex); - err = wait_event_interruptible(module_wq, - finished_loading(mod->name)); - if (err) - goto out_unlocked; - goto again; + return -EEXIST; } - err = -EEXIST; - goto out; + + /* Wait in case it fails to load. */ + mutex_unlock(&module_mutex); + err = wait_event_interruptible(module_wq, + finished_loading(mod->name)); + if (err) + return err; + + /* Did the load succeded or failed? */ + goto again; } + mod_update_bounds(mod); list_add_rcu(&mod->list, &modules); mod_tree_insert(mod); - err = 0; -out: mutex_unlock(&module_mutex); -out_unlocked: - return err; + return 0; } static int complete_formation(struct module *mod, struct load_info *info) -- 2.16.4