From: Jessica Yu <jeyu@kernel.org>
To: Russell King <linux@armlinux.org.uk>
Cc: Peter Zijlstra <peterz@infradead.org>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, Jessica Yu <jeyu@kernel.org>
Subject: [PATCH] ARM: module: treat exit sections the same as init sections when !CONFIG_MODULE_UNLOAD
Date: Fri, 7 May 2021 14:13:22 +0200 [thread overview]
Message-ID: <20210507121322.6441-1-jeyu@kernel.org> (raw)
Dynamic code patching (alternatives, jump_label and static_call) can
have sites in __exit code, even if __exit is never executed. Therefore
__exit must be present at runtime, at least for as long as __init code is.
Additionally, for jump_label and static_call, the __exit sites must also
identify as within_module_init(), such that the infrastructure is aware
to never touch them after module init -- alternatives are only ran once
at init and hence don't have this particular constraint.
Previously, the module loader never loaded the exit sections in the first
place when CONFIG_MODULE_UNLOAD=n. Commit 33121347fb1c ("module: treat exit
sections the same as init sections when !CONFIG_MODULE_UNLOAD") addressed
the issue by having the module loader load the exit sections and then making
__exit identify as __init for !MODULE_UNLOAD. Then, since they are treated
like init sections, they will be also discarded after init.
That commit satisfied the above requirements for jump_labels and
static_calls by modifying the checks in the core module_init_section()
function in kernel/module.c to include exit sections. However, ARM
overrides these and implements their own module_{init,exit}_section()
functions. Add a similar check for exit sections to ARM's
module_init_section() function so that all arches are on the same page.
Fixes: 33121347fb1c ("module: treat exit sections the same as init
sections when !CONFIG_MODULE_UNLOAD")
Link: https://lore.kernel.org/lkml/YFiuphGw0RKehWsQ@gunter/
Link: https://lore.kernel.org/r/20210323142756.11443-1-jeyu@kernel.org
Signed-off-by: Jessica Yu <jeyu@kernel.org>
---
arch/arm/kernel/module.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
index beac45e89ba6..9d403fc1893b 100644
--- a/arch/arm/kernel/module.c
+++ b/arch/arm/kernel/module.c
@@ -56,9 +56,16 @@ void *module_alloc(unsigned long size)
bool module_init_section(const char *name)
{
+#ifndef CONFIG_MODULE_UNLOAD
+ return strstarts(name, ".init") ||
+ strstarts(name, ".ARM.extab.init") ||
+ strstarts(name, ".ARM.exidx.init") ||
+ module_exit_section(name);
+#else
return strstarts(name, ".init") ||
strstarts(name, ".ARM.extab.init") ||
strstarts(name, ".ARM.exidx.init");
+#endif
}
bool module_exit_section(const char *name)
--
2.31.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: Jessica Yu <jeyu@kernel.org>
To: Russell King <linux@armlinux.org.uk>
Cc: Peter Zijlstra <peterz@infradead.org>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, Jessica Yu <jeyu@kernel.org>
Subject: [PATCH] ARM: module: treat exit sections the same as init sections when !CONFIG_MODULE_UNLOAD
Date: Fri, 7 May 2021 14:13:22 +0200 [thread overview]
Message-ID: <20210507121322.6441-1-jeyu@kernel.org> (raw)
Dynamic code patching (alternatives, jump_label and static_call) can
have sites in __exit code, even if __exit is never executed. Therefore
__exit must be present at runtime, at least for as long as __init code is.
Additionally, for jump_label and static_call, the __exit sites must also
identify as within_module_init(), such that the infrastructure is aware
to never touch them after module init -- alternatives are only ran once
at init and hence don't have this particular constraint.
Previously, the module loader never loaded the exit sections in the first
place when CONFIG_MODULE_UNLOAD=n. Commit 33121347fb1c ("module: treat exit
sections the same as init sections when !CONFIG_MODULE_UNLOAD") addressed
the issue by having the module loader load the exit sections and then making
__exit identify as __init for !MODULE_UNLOAD. Then, since they are treated
like init sections, they will be also discarded after init.
That commit satisfied the above requirements for jump_labels and
static_calls by modifying the checks in the core module_init_section()
function in kernel/module.c to include exit sections. However, ARM
overrides these and implements their own module_{init,exit}_section()
functions. Add a similar check for exit sections to ARM's
module_init_section() function so that all arches are on the same page.
Fixes: 33121347fb1c ("module: treat exit sections the same as init
sections when !CONFIG_MODULE_UNLOAD")
Link: https://lore.kernel.org/lkml/YFiuphGw0RKehWsQ@gunter/
Link: https://lore.kernel.org/r/20210323142756.11443-1-jeyu@kernel.org
Signed-off-by: Jessica Yu <jeyu@kernel.org>
---
arch/arm/kernel/module.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
index beac45e89ba6..9d403fc1893b 100644
--- a/arch/arm/kernel/module.c
+++ b/arch/arm/kernel/module.c
@@ -56,9 +56,16 @@ void *module_alloc(unsigned long size)
bool module_init_section(const char *name)
{
+#ifndef CONFIG_MODULE_UNLOAD
+ return strstarts(name, ".init") ||
+ strstarts(name, ".ARM.extab.init") ||
+ strstarts(name, ".ARM.exidx.init") ||
+ module_exit_section(name);
+#else
return strstarts(name, ".init") ||
strstarts(name, ".ARM.extab.init") ||
strstarts(name, ".ARM.exidx.init");
+#endif
}
bool module_exit_section(const char *name)
--
2.31.1
next reply other threads:[~2021-05-07 12:22 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-07 12:13 Jessica Yu [this message]
2021-05-07 12:13 ` [PATCH] ARM: module: treat exit sections the same as init sections when !CONFIG_MODULE_UNLOAD Jessica Yu
2021-05-07 12:30 ` Russell King - ARM Linux admin
2021-05-07 12:30 ` Russell King - ARM Linux admin
2021-05-07 12:48 ` Jessica Yu
2021-05-07 12:48 ` Jessica Yu
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=20210507121322.6441-1-jeyu@kernel.org \
--to=jeyu@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=peterz@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.