Fix lack of section mismatch warnings with LTO
Subsystems (3)
Nathan Chancellor
maintainerv3 cover Fix lack of section mismatch warnings with LTO
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.
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/[email protected]/
v1: https://lore.kernel.org/[email protected]/
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
Signature · 1 line
2.39.0
Nathan Chancellor
maintainerPATCH v3 1/2 padata: Mark padata_work_init() as __ref
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.
---
Cc: Steffen Klassert <[email protected]>
Cc: Daniel Jordan <[email protected]>
Cc: [email protected]
--- kernel/padata.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
kernel/padata.c +10 -2
@@ -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);
Signature · 1 line
2.39.0
Nathan Chancellor
maintainerPATCH v3 2/2 modpost: Include '.text.*' in TEXT_SECTIONS
In reply to Nathan ChancellorCommit 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.
--- scripts/mod/modpost.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
scripts/mod/modpost.c +2 -2
@@ -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.*"
Signature · 1 line
2.39.0
Quoted 11 lines · Nathan Chancellor
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.ldsanyways.
Quoted 6 lines
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_SECTIONSso 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.
Quoted 27 lines
v3:
- Stick a comment abovepadata_work_init()to explain presence of__ref(Masahiro, Daniel).
- Expand on problem in first patch's commit message (Masahiro).
- Adjust location of__refwithin function definition (Daniel)
- Fix typo in commit message of second patch (Masahiro).
v2: https://lore.kernel.org/[email protected]/
v1: https://lore.kernel.org/[email protected]/Nathan Chancellor (2):
padata: Markpadata_work_init()as__ref
modpost: Include '.text.*' inTEXT_SECTIONSkernel/padata.c | 12 ++++++++++-- scripts/mod/modpost.c | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-)base-commit:
830b3c68c1fb1e9176028d02ef86f3cf76aa2476--
2.39.0
Signature · 2 lines
Best Regards Masahiro Yamada