* [PATCH v3 1/2] padata: Mark padata_work_init() as __ref
2022-12-13 18:35 [PATCH v3 0/2] Fix lack of section mismatch warnings with LTO Nathan Chancellor
@ 2022-12-13 18:35 ` Nathan Chancellor
2022-12-13 18:35 ` [PATCH v3 2/2] modpost: Include '.text.*' in TEXT_SECTIONS Nathan Chancellor
2022-12-14 6:52 ` [PATCH v3 0/2] Fix lack of section mismatch warnings with LTO Masahiro Yamada
2 siblings, 0 replies; 4+ messages in thread
From: Nathan Chancellor @ 2022-12-13 18:35 UTC (permalink / raw)
To: Masahiro Yamada
Cc: Nick Desaulniers, Tom Rix, Nicolas Schier, Sami Tolvanen,
Vincent Donnefort, linux-kbuild, linux-kernel, llvm, patches,
Nathan Chancellor, Daniel Jordan, Steffen Klassert, linux-crypto
When building arm64 allmodconfig + ThinLTO with clang and a proposed
modpost update to account for -ffuncton-sections, the following warning
appears:
WARNING: modpost: vmlinux.o: section mismatch in reference: padata_work_init (section: .text.padata_work_init) -> padata_mt_helper (section: .init.text)
WARNING: modpost: vmlinux.o: section mismatch in reference: padata_work_init (section: .text.padata_work_init) -> padata_mt_helper (section: .init.text)
LLVM has optimized padata_work_init() to include the address of
padata_mt_helper() directly because it inlined the other call to
padata_work_init() with padata_parallel_worker(), meaning the remaining
uses of padata_work_init() use padata_mt_helper() as the work_fn
argument. This optimization causes modpost to complain since
padata_work_init() is not __init, whereas padata_mt_helper() is.
Since padata_work_init() is only called from __init code when
padata_mt_helper() is passed as the work_fn argument, mark
padata_work_init() as __ref, which makes it clear to modpost that this
scenario is okay.
Suggested-by: Daniel Jordan <daniel.m.jordan@oracle.com>
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
Cc: Steffen Klassert <steffen.klassert@secunet.com>
Cc: Daniel Jordan <daniel.m.jordan@oracle.com>
Cc: linux-crypto@vger.kernel.org
---
kernel/padata.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/kernel/padata.c b/kernel/padata.c
index e5819bb8bd1d..d175cc000453 100644
--- a/kernel/padata.c
+++ b/kernel/padata.c
@@ -83,8 +83,16 @@ static struct padata_work *padata_work_alloc(void)
return pw;
}
-static void padata_work_init(struct padata_work *pw, work_func_t work_fn,
- void *data, int flags)
+/*
+ * This function is marked __ref because this function may be optimized in such
+ * a way that it directly refers to work_fn's address, which causes modpost to
+ * complain when work_fn is marked __init. This scenario was observed with clang
+ * LTO, where padata_work_init() was optimized to refer directly to
+ * padata_mt_helper() because the calls to padata_work_init() with other work_fn
+ * values were eliminated or inlined.
+ */
+static void __ref padata_work_init(struct padata_work *pw, work_func_t work_fn,
+ void *data, int flags)
{
if (flags & PADATA_WORK_ONSTACK)
INIT_WORK_ONSTACK(&pw->pw_work, work_fn);
--
2.39.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH v3 2/2] modpost: Include '.text.*' in TEXT_SECTIONS
2022-12-13 18:35 [PATCH v3 0/2] Fix lack of section mismatch warnings with LTO Nathan Chancellor
2022-12-13 18:35 ` [PATCH v3 1/2] padata: Mark padata_work_init() as __ref Nathan Chancellor
@ 2022-12-13 18:35 ` Nathan Chancellor
2022-12-14 6:52 ` [PATCH v3 0/2] Fix lack of section mismatch warnings with LTO Masahiro Yamada
2 siblings, 0 replies; 4+ messages in thread
From: Nathan Chancellor @ 2022-12-13 18:35 UTC (permalink / raw)
To: Masahiro Yamada
Cc: Nick Desaulniers, Tom Rix, Nicolas Schier, Sami Tolvanen,
Vincent Donnefort, linux-kbuild, linux-kernel, llvm, patches,
Nathan Chancellor, Alexander Lobakin
Commit 6c730bfc894f ("modpost: handle -ffunction-sections") added
".text.*" to the OTHER_TEXT_SECTIONS macro to fix certain section
mismatch warnings. Unfortunately, this makes it impossible for modpost
to warn about section mismatches with LTO, which implies
'-ffunction-sections', as all functions are put in their own
'.text.<func_name>' sections, which may still reference functions in
sections they are not supposed to, such as __init.
Fix this by moving ".text.*" into TEXT_SECTIONS, so that configurations
with '-ffunction-sections' will see warnings about mismatched sections.
Link: https://lore.kernel.org/Y39kI3MOtVI5BAnV@google.com/
Reported-by: Vincent Donnefort <vdonnefort@google.com>
Reviewed-and-tested-by: Alexander Lobakin <alexandr.lobakin@intel.com>
Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
Tested-by: Vincent Donnefort <vdonnefort@google.com>
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
scripts/mod/modpost.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 2c80da0220c3..c861beabc128 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -823,10 +823,10 @@ static void check_section(const char *modname, struct elf_info *elf,
#define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
#define DATA_SECTIONS ".data", ".data.rel"
-#define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \
+#define TEXT_SECTIONS ".text", ".text.*", ".sched.text", \
".kprobes.text", ".cpuidle.text", ".noinstr.text"
#define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \
- ".fixup", ".entry.text", ".exception.text", ".text.*", \
+ ".fixup", ".entry.text", ".exception.text", \
".coldtext", ".softirqentry.text"
#define INIT_SECTIONS ".init.*"
--
2.39.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH v3 0/2] Fix lack of section mismatch warnings with LTO
2022-12-13 18:35 [PATCH v3 0/2] Fix lack of section mismatch warnings with LTO Nathan Chancellor
2022-12-13 18:35 ` [PATCH v3 1/2] padata: Mark padata_work_init() as __ref Nathan Chancellor
2022-12-13 18:35 ` [PATCH v3 2/2] modpost: Include '.text.*' in TEXT_SECTIONS Nathan Chancellor
@ 2022-12-14 6:52 ` Masahiro Yamada
2 siblings, 0 replies; 4+ messages in thread
From: Masahiro Yamada @ 2022-12-14 6:52 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Nick Desaulniers, Tom Rix, Nicolas Schier, Sami Tolvanen,
Vincent Donnefort, linux-kbuild, linux-kernel, llvm, patches,
Steffen Klassert, Daniel Jordan, linux-crypto
On Wed, Dec 14, 2022 at 3:35 AM Nathan Chancellor <nathan@kernel.org> wrote:
>
> Hi all,
>
> Vincent recently reported an issue with lack of section mismatch
> warnings with LTO. This is due to commit 6c730bfc894f ("modpost: handle
> -ffunction-sections"), which ignores all function sections for modpost.
>
> I believe this is incorrect, as these function sections may still refer
> to symbols in other sections and they will ultimately be coalesced into
> .text by vmlinux.lds anyways.
>
> The first patch fixes a warning that I see with allmodconfig + ThinLTO
> builds after applying the second patch. The second patch moves ".text.*"
> into TEXT_SECTIONS so that modpost audits them for mismatches.
>
> I expect this to go via the kbuild tree with an ack from the padata
> maintainers.
Daniel Acked v2.
Applied to kbuild with his Acked-by.
Thanks.
>
> Cc: Steffen Klassert <steffen.klassert@secunet.com>
> Cc: Daniel Jordan <daniel.m.jordan@oracle.com>
> Cc: linux-crypto@vger.kernel.org
>
> v3:
> - Stick a comment above padata_work_init() to explain presence of
> __ref (Masahiro, Daniel).
> - Expand on problem in first patch's commit message (Masahiro).
> - Adjust location of __ref within function definition (Daniel)
> - Fix typo in commit message of second patch (Masahiro).
> v2: https://lore.kernel.org/20221207191657.2852229-1-nathan@kernel.org/
> v1: https://lore.kernel.org/20221129190123.872394-1-nathan@kernel.org/
>
> Nathan Chancellor (2):
> padata: Mark padata_work_init() as __ref
> modpost: Include '.text.*' in TEXT_SECTIONS
>
> kernel/padata.c | 12 ++++++++++--
> scripts/mod/modpost.c | 4 ++--
> 2 files changed, 12 insertions(+), 4 deletions(-)
>
>
> base-commit: 830b3c68c1fb1e9176028d02ef86f3cf76aa2476
> --
> 2.39.0
>
--
Best Regards
Masahiro Yamada
^ permalink raw reply [flat|nested] 4+ messages in thread