From: Luis Chamberlain <mcgrof@kernel.org>
To: david@redhat.com, patches@lists.linux.dev,
linux-modules@vger.kernel.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, pmladek@suse.com,
petr.pavlu@suse.com, prarit@redhat.com,
torvalds@linux-foundation.org, gregkh@linuxfoundation.org,
rafael@kernel.org
Cc: christophe.leroy@csgroup.eu, tglx@linutronix.de,
peterz@infradead.org, song@kernel.org, rppt@kernel.org,
dave@stgolabs.net, willy@infradead.org, vbabka@suse.cz,
mhocko@suse.com, dave.hansen@linux.intel.com,
colin.i.king@gmail.com, jim.cromie@gmail.com,
catalin.marinas@arm.com, jbaron@akamai.com,
rick.p.edgecombe@intel.com, mcgrof@kernel.org
Subject: [PATCH v2 3/6] module: extract patient module check into helper
Date: Tue, 4 Apr 2023 19:26:59 -0700 [thread overview]
Message-ID: <20230405022702.753323-4-mcgrof@kernel.org> (raw)
In-Reply-To: <20230405022702.753323-1-mcgrof@kernel.org>
The patient module check inside add_unformed_module() is large
enough as we need it. It is a bit hard to read too, so just
move it to a helper and do the inverse checks first to help
shift the code and make it easier to read. The new helper then
is module_patient_check_exists().
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
kernel/module/main.c | 71 +++++++++++++++++++++++++-------------------
1 file changed, 40 insertions(+), 31 deletions(-)
diff --git a/kernel/module/main.c b/kernel/module/main.c
index 98c261928325..8f382580195b 100644
--- a/kernel/module/main.c
+++ b/kernel/module/main.c
@@ -2638,6 +2638,43 @@ static bool finished_loading(const char *name)
return ret;
}
+/* Must be called with module_mutex held */
+static int module_patient_check_exists(const char *name)
+{
+ struct module *old;
+ int err = 0;
+
+ old = find_module_all(name, strlen(name), true);
+ if (old == NULL)
+ return 0;
+
+ if (old->state == MODULE_STATE_COMING
+ || old->state == MODULE_STATE_UNFORMED) {
+ /* Wait in case it fails to load. */
+ mutex_unlock(&module_mutex);
+ err = wait_event_interruptible(module_wq,
+ finished_loading(name));
+ if (err)
+ return err;
+
+ /* The module might have gone in the meantime. */
+ mutex_lock(&module_mutex);
+ old = find_module_all(name, strlen(name), true);
+ }
+
+ /*
+ * We are here only when the same module was being loaded. Do
+ * not try to load it again right now. It prevents long delays
+ * caused by serialized module load failures. It might happen
+ * when more devices of the same type trigger load of
+ * a particular module.
+ */
+ if (old && old->state == MODULE_STATE_LIVE)
+ return -EEXIST;
+ else
+ return -EBUSY;
+}
+
/*
* We try to place it in the list now to make sure it's unique before
* we dedicate too many resources. In particular, temporary percpu
@@ -2646,41 +2683,14 @@ static bool finished_loading(const char *name)
static int add_unformed_module(struct module *mod)
{
int err;
- struct module *old;
mod->state = MODULE_STATE_UNFORMED;
mutex_lock(&module_mutex);
- old = find_module_all(mod->name, strlen(mod->name), true);
- if (old != NULL) {
- if (old->state == MODULE_STATE_COMING
- || old->state == MODULE_STATE_UNFORMED) {
- /* Wait in case it fails to load. */
- mutex_unlock(&module_mutex);
- err = wait_event_interruptible(module_wq,
- finished_loading(mod->name));
- if (err)
- goto out_unlocked;
-
- /* The module might have gone in the meantime. */
- mutex_lock(&module_mutex);
- old = find_module_all(mod->name, strlen(mod->name),
- true);
- }
-
- /*
- * We are here only when the same module was being loaded. Do
- * not try to load it again right now. It prevents long delays
- * caused by serialized module load failures. It might happen
- * when more devices of the same type trigger load of
- * a particular module.
- */
- if (old && old->state == MODULE_STATE_LIVE)
- err = -EEXIST;
- else
- err = -EBUSY;
+ err = module_patient_check_exists(mod->name);
+ if (err)
goto out;
- }
+
mod_update_bounds(mod);
list_add_rcu(&mod->list, &modules);
mod_tree_insert(mod);
@@ -2688,7 +2698,6 @@ static int add_unformed_module(struct module *mod)
out:
mutex_unlock(&module_mutex);
-out_unlocked:
return err;
}
--
2.39.2
next prev parent reply other threads:[~2023-04-05 2:27 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-05 2:26 [PATCH v2 0/6] module: avoid userspace pressure on unwanted allocations Luis Chamberlain
2023-04-05 2:26 ` [PATCH v2 1/6] module: fix kmemleak annotations for non init ELF sections Luis Chamberlain
2023-04-05 6:52 ` Song Liu
2023-04-11 15:17 ` Catalin Marinas
2023-04-11 17:06 ` Luis Chamberlain
2023-04-05 2:26 ` [PATCH v2 2/6] module: move finished_loading() Luis Chamberlain
2023-04-05 17:06 ` David Hildenbrand
2023-04-05 19:55 ` Luis Chamberlain
2023-04-05 2:26 ` Luis Chamberlain [this message]
2023-04-05 17:11 ` [PATCH v2 3/6] module: extract patient module check into helper David Hildenbrand
2023-04-05 19:45 ` Luis Chamberlain
2023-04-05 2:27 ` [PATCH v2 4/6] module: avoid allocation if module is already present and ready Luis Chamberlain
2023-04-05 2:27 ` [PATCH v2 5/6] debugfs: add debugfs_create_atomic64_t for atomic64_t Luis Chamberlain
2023-04-05 15:26 ` Linus Torvalds
2023-04-05 16:04 ` Luis Chamberlain
2023-04-05 16:11 ` Luis Chamberlain
2023-04-05 16:23 ` Linus Torvalds
2023-04-05 16:53 ` Luis Chamberlain
2023-04-06 8:15 ` David Laight
2023-04-06 13:38 ` Christophe Leroy
2023-04-06 13:48 ` David Laight
2023-04-06 14:14 ` David Hildenbrand
2023-04-05 2:27 ` [PATCH v2 6/6] module: add debug stats to help identify memory pressure Luis Chamberlain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230405022702.753323-4-mcgrof@kernel.org \
--to=mcgrof@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=christophe.leroy@csgroup.eu \
--cc=colin.i.king@gmail.com \
--cc=dave.hansen@linux.intel.com \
--cc=dave@stgolabs.net \
--cc=david@redhat.com \
--cc=gregkh@linuxfoundation.org \
--cc=jbaron@akamai.com \
--cc=jim.cromie@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-modules@vger.kernel.org \
--cc=mhocko@suse.com \
--cc=patches@lists.linux.dev \
--cc=peterz@infradead.org \
--cc=petr.pavlu@suse.com \
--cc=pmladek@suse.com \
--cc=prarit@redhat.com \
--cc=rafael@kernel.org \
--cc=rick.p.edgecombe@intel.com \
--cc=rppt@kernel.org \
--cc=song@kernel.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=vbabka@suse.cz \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.