All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/2] Fix lack of section mismatch warnings with LTO
@ 2022-12-13 18:35 Nathan Chancellor
  2022-12-13 18:35 ` [PATCH v3 1/2] padata: Mark padata_work_init() as __ref Nathan Chancellor
                   ` (2 more replies)
  0 siblings, 3 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, Steffen Klassert, Daniel Jordan, linux-crypto

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.

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


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [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

end of thread, other threads:[~2022-12-14  6:53 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 ` [PATCH v3 0/2] Fix lack of section mismatch warnings with LTO Masahiro Yamada

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.