When upreving llvm I realised that kexec stopped working on my test
platform.
The reason seems to be that due to PGO there are multiple .text sections
on the purgatory, and kexec does not supports that.
Signed-off-by: Ricardo Ribalda <redacted>
---
Changes in v6:
- Replace linker script with Makefile rule. Thanks Nick
- Link to v5: https://lore.kernel.org/r/20230321-kexec_clang16-v5-0-5563bf7c4173@chromium.org
Changes in v5:
- Add warning when multiple text sections are found. Thanks Simon!
- Add Fixes tag.
- Link to v4: https://lore.kernel.org/r/20230321-kexec_clang16-v4-0-1340518f98e9@chromium.org
Changes in v4:
- Add Cc: stable
- Add linker script for x86
- Add a warning when the kernel image has overlapping sections.
- Link to v3: https://lore.kernel.org/r/20230321-kexec_clang16-v3-0-5f016c8d0e87@chromium.org
Changes in v3:
- Fix initial value. Thanks Ross!
- Link to v2: https://lore.kernel.org/r/20230321-kexec_clang16-v2-0-d10e5d517869@chromium.org
Changes in v2:
- Fix if condition. Thanks Steven!.
- Update Philipp email. Thanks Baoquan.
- Link to v1: https://lore.kernel.org/r/20230321-kexec_clang16-v1-0-a768fc2c7c4d@chromium.org
---
Ricardo Ribalda (4):
kexec: Support purgatories with .text.hot sections
x86/purgatory: Remove profile optimization flags
powerpc/purgatory: Remove profile optimization flags
risc/purgatory: Add linker script
arch/powerpc/purgatory/Makefile | 5 +++++
arch/riscv/purgatory/Makefile | 5 +++++
arch/x86/purgatory/Makefile | 5 +++++
kernel/kexec_file.c | 14 +++++++++++++-
4 files changed, 28 insertions(+), 1 deletion(-)
---
base-commit: 58390c8ce1bddb6c623f62e7ed36383e7fa5c02f
change-id: 20230321-kexec_clang16-4510c23d129c
Best regards,
--
Ricardo Ribalda [off-list ref]
Clang16 links the purgatory text in two sections when PGO is in use:
[ 1] .text PROGBITS 0000000000000000 00000040
00000000000011a1 0000000000000000 AX 0 0 16
[ 2] .rela.text RELA 0000000000000000 00003498
0000000000000648 0000000000000018 I 24 1 8
...
[17] .text.hot. PROGBITS 0000000000000000 00003220
000000000000020b 0000000000000000 AX 0 0 1
[18] .rela.text.hot. RELA 0000000000000000 00004428
0000000000000078 0000000000000018 I 24 17 8
And both of them have their range [sh_addr ... sh_addr+sh_size] on the
area pointed by `e_entry`.
This causes that image->start is calculated twice, once for .text and
another time for .text.hot. The second calculation leaves image->start
in a random location.
Because of this, the system crashes immediately after:
kexec_core: Starting new kernel
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Reviewed-by: Ross Zwisler <redacted>
Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Reviewed-by: Philipp Rudo <redacted>
Signed-off-by: Ricardo Ribalda <redacted>
---
kernel/kexec_file.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
---
arch/x86/purgatory/Makefile | 5 +++++
1 file changed, 5 insertions(+)
@@ -14,6 +14,11 @@ $(obj)/sha256.o: $(srctree)/lib/crypto/sha256.c FORCECFLAGS_sha256.o:=-D__DISABLE_EXPORTS+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))+# When linking purgatory.ro with -r unresolved symbols are not checked,# also link a purgatory.chk binary without -r to check for unresolved symbols.PURGATORY_LDFLAGS:=-epurgatory_start-znodefaultlib
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
---
arch/powerpc/purgatory/Makefile | 5 +++++
1 file changed, 5 insertions(+)
@@ -5,6 +5,11 @@ KCSAN_SANITIZE := ntargets+=trampoline_$(BITS).opurgatory.ro+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))+LDFLAGS_purgatory.ro:=-epurgatory_start-r--no-undefined$(obj)/purgatory.ro:$(obj)/trampoline_$(BITS).oFORCE
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
---
arch/riscv/purgatory/Makefile | 5 +++++
1 file changed, 5 insertions(+)
@@ -35,6 +35,11 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTSCFLAGS_string.o:=-D__DISABLE_EXPORTSCFLAGS_ctype.o:=-D__DISABLE_EXPORTS+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))+# When linking purgatory.ro with -r unresolved symbols are not checked,# also link a purgatory.chk binary without -r to check for unresolved symbols.PURGATORY_LDFLAGS:=-epurgatory_start-znodefaultlib
On Mon, 01 May 2023 05:38:22 PDT (-0700), ribalda@chromium.org wrote:
quoted hunk
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
---
arch/riscv/purgatory/Makefile | 5 +++++
1 file changed, 5 insertions(+)
@@ -35,6 +35,11 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTSCFLAGS_string.o:=-D__DISABLE_EXPORTSCFLAGS_ctype.o:=-D__DISABLE_EXPORTS+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))+# When linking purgatory.ro with -r unresolved symbols are not checked,# also link a purgatory.chk binary without -r to check for unresolved symbols.PURGATORY_LDFLAGS:=-epurgatory_start-znodefaultlib
From: Nick Desaulniers <ndesaulniers@google.com> Date: 2023-05-01 16:19:37
On Mon, May 1, 2023 at 5:39 AM Ricardo Ribalda [off-list ref] wrote:
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
Hi Ricardo,
Thanks for the series. Does this patch 4/4 need a new online commit
description? It's not adding a linker script (maybe an earlier version
was).
@@ -35,6 +35,11 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTSCFLAGS_string.o:=-D__DISABLE_EXPORTSCFLAGS_ctype.o:=-D__DISABLE_EXPORTS+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))+# When linking purgatory.ro with -r unresolved symbols are not checked,# also link a purgatory.chk binary without -r to check for unresolved symbols.PURGATORY_LDFLAGS:=-epurgatory_start-znodefaultlib--
Hi Nick
Thanks for catching this. It should have said
risc/purgatory: Remove profile optimization flags
Will fix it on my local branch in case there is a next version of the
series. Otherwise, please the maintainer fix the subject.
Thanks!
On Mon, 1 May 2023 at 18:19, Nick Desaulniers [off-list ref] wrote:
On Mon, May 1, 2023 at 5:39 AM Ricardo Ribalda [off-list ref] wrote:
quoted
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
Hi Ricardo,
Thanks for the series. Does this patch 4/4 need a new online commit
description? It's not adding a linker script (maybe an earlier version
was).
@@ -35,6 +35,11 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTSCFLAGS_string.o:=-D__DISABLE_EXPORTSCFLAGS_ctype.o:=-D__DISABLE_EXPORTS+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))+# When linking purgatory.ro with -r unresolved symbols are not checked,# also link a purgatory.chk binary without -r to check for unresolved symbols.PURGATORY_LDFLAGS:=-epurgatory_start-znodefaultlib--
On Mon, May 01, 2023 at 07:18:12PM +0200, Ricardo Ribalda wrote:
On Mon, 1 May 2023 at 18:19, Nick Desaulniers [off-list ref] wrote:
quoted
On Mon, May 1, 2023 at 5:39 AM Ricardo Ribalda [off-list ref] wrote:
quoted
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
Hi Ricardo,
Thanks for the series. Does this patch 4/4 need a new online commit
description? It's not adding a linker script (maybe an earlier version
was).
Thanks for catching this. It should have said
risc/purgatory: Remove profile optimization flags
^^
Perhaps with the omitted v added too?
Also while playing the $subject nitpicking game, is it not called
"profile**-guided** optimisation" (and ditto in the comments)?
Cheers,
Conor.
Will fix it on my local branch in case there is a next version of the
series. Otherwise, please the maintainer fix the subject.
@@ -35,6 +35,11 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTSCFLAGS_string.o:=-D__DISABLE_EXPORTSCFLAGS_ctype.o:=-D__DISABLE_EXPORTS+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))+# When linking purgatory.ro with -r unresolved symbols are not checked,# also link a purgatory.chk binary without -r to check for unresolved symbols.PURGATORY_LDFLAGS:=-epurgatory_start-znodefaultlib--
On Mon, May 01, 2023 at 07:18:12PM +0200, Ricardo Ribalda wrote:
quoted
On Mon, 1 May 2023 at 18:19, Nick Desaulniers [off-list ref] wrote:
quoted
On Mon, May 1, 2023 at 5:39 AM Ricardo Ribalda [off-list ref] wrote:
quoted
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
Hi Ricardo,
Thanks for the series. Does this patch 4/4 need a new online commit
description? It's not adding a linker script (maybe an earlier version
was).
quoted
Thanks for catching this. It should have said
risc/purgatory: Remove profile optimization flags
^^
Perhaps with the omitted v added too?
Also while playing the $subject nitpicking game, is it not called
"profile**-guided** optimisation" (and ditto in the comments)?
Cheers,
Conor.
quoted
Will fix it on my local branch in case there is a next version of the
series. Otherwise, please the maintainer fix the subject.
@@ -35,6 +35,11 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTSCFLAGS_string.o:=-D__DISABLE_EXPORTSCFLAGS_ctype.o:=-D__DISABLE_EXPORTS+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))+# When linking purgatory.ro with -r unresolved symbols are not checked,# also link a purgatory.chk binary without -r to check for unresolved symbols.PURGATORY_LDFLAGS:=-epurgatory_start-znodefaultlib--
Hey Ricardo,
On Mon, May 01, 2023 at 02:38:22PM +0200, Ricardo Ribalda wrote:
quoted hunk
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
---
arch/riscv/purgatory/Makefile | 5 +++++
1 file changed, 5 insertions(+)
@@ -35,6 +35,11 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTSCFLAGS_string.o:=-D__DISABLE_EXPORTSCFLAGS_ctype.o:=-D__DISABLE_EXPORTS+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))
With the caveat of not being au fait with the workings of either PGO or
of purgatory, how come you modify KBUILD_CFLAGS here rather than the
purgatory specific PURGATORY_CFLAGS that are used later in the file?
Cheers,
Conor.
+
# When linking purgatory.ro with -r unresolved symbols are not checked,
# also link a purgatory.chk binary without -r to check for unresolved symbols.
PURGATORY_LDFLAGS := -e purgatory_start -z nodefaultlib
--
2.40.1.495.gc816e09b53d-goog
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
Hi Conor
On Mon, 1 May 2023 at 19:41, Conor Dooley [off-list ref] wrote:
Hey Ricardo,
On Mon, May 01, 2023 at 02:38:22PM +0200, Ricardo Ribalda wrote:
quoted
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
---
arch/riscv/purgatory/Makefile | 5 +++++
1 file changed, 5 insertions(+)
@@ -35,6 +35,11 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTSCFLAGS_string.o:=-D__DISABLE_EXPORTSCFLAGS_ctype.o:=-D__DISABLE_EXPORTS+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))
With the caveat of not being au fait with the workings of either PGO or
of purgatory, how come you modify KBUILD_CFLAGS here rather than the
purgatory specific PURGATORY_CFLAGS that are used later in the file?
Definitely, not a Makefile expert here, but when I tried this:
It did not work.
Fixes: bde971a83bbf ("KVM: arm64: nvhe: Fix build with profile optimization")
does this approach, so this is what I tried and worked.
Thanks!
Cheers,
Conor.
quoted
+
# When linking purgatory.ro with -r unresolved symbols are not checked,
# also link a purgatory.chk binary without -r to check for unresolved symbols.
PURGATORY_LDFLAGS := -e purgatory_start -z nodefaultlib
--
2.40.1.495.gc816e09b53d-goog
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
On Mon, May 01, 2023 at 09:54:43PM +0200, Ricardo Ribalda wrote:
quoted hunk
On Mon, 1 May 2023 at 19:41, Conor Dooley [off-list ref] wrote:
quoted
On Mon, May 01, 2023 at 02:38:22PM +0200, Ricardo Ribalda wrote:
quoted
If PGO is enabled, the purgatory ends up with multiple .text sections.
This is not supported by kexec and crashes the system.
Cc: stable@vger.kernel.org
Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
Signed-off-by: Ricardo Ribalda <redacted>
---
arch/riscv/purgatory/Makefile | 5 +++++
1 file changed, 5 insertions(+)
@@ -35,6 +35,11 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTSCFLAGS_string.o:=-D__DISABLE_EXPORTSCFLAGS_ctype.o:=-D__DISABLE_EXPORTS+# When profile optimization is enabled, llvm emits two different overlapping+# text sections, which is not supported by kexec. Remove profile optimization+# flags.+KBUILD_CFLAGS:=$(filter-out-fprofile-sample-use=%-fprofile-use=%,$(KBUILD_CFLAGS))
With the caveat of not being au fait with the workings of either PGO or
of purgatory, how come you modify KBUILD_CFLAGS here rather than the
purgatory specific PURGATORY_CFLAGS that are used later in the file?
Definitely, not a Makefile expert here, but when I tried this:
Unfortunately I am oh-so-far from an expert on this kind of thing, but I
had thought that PURGATORY_CFLAGS_REMOVE was intended for this sort of
purpose.
Fixes: bde971a83bbf ("KVM: arm64: nvhe: Fix build with profile optimization")
does this approach, so this is what I tried and worked.
That doesn't have a specific CFLAGS though afaict.
Perhaps Nick etc have a more informed opinion here than I do, sorry.
Thanks,
Conor.
quoted
quoted
+
# When linking purgatory.ro with -r unresolved symbols are not checked,
# also link a purgatory.chk binary without -r to check for unresolved symbols.
PURGATORY_LDFLAGS := -e purgatory_start -z nodefaultlib
--
2.40.1.495.gc816e09b53d-goog
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv