Hi Song
On Fri, 8 Sept 2023 at 23:48, Song Liu song@kernel.org wrote:
Hi Ricardo,
Thanks for your kind reply.
On Fri, Sep 8, 2023 at 2:18 PM Ricardo Ribalda ribalda@chromium.org wrote:
Hi Song
On Fri, 8 Sept 2023 at 01:08, Song Liu song@kernel.org wrote:
Hi Ricardo and folks,
On Fri, May 19, 2023 at 7:48 AM Ricardo Ribalda ribalda@chromium.org wrote:
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 ribalda@chromium.org
We are seeing WARNINGs like the following while kexec'ing a PGO and LTO enabled kernel:
WARNING: CPU: 26 PID: 110894 at kernel/kexec_file.c:919 kexec_load_purgatory+0x37f/0x390
AFAICT, the warning was added by this set, and it was triggered when we have many .text sections in purgatory.ro. The kexec was actually successful. So I wonder whether we really need the WARNING here. If we disable LTO (PGO is still enabled), we don't see the WARNING any more.
I also tested an older kernel (5.19 based), where we also see many .text sections with LTO. It kexec()'ed fine. (It doesn't have the WARN_ON() in kexec_purgatory_setup_sechdrs).
You have been "lucky" that the code has chosen the correct start address, you need to modify the linker script of your kernel to disable PGO. You need to backport a patch like this: https://lore.kernel.org/lkml/CAPhsuW5_qAvV0N3o+hOiAnb1=buJ1pLzqYW9D+Bwft6hxJ...
We already have this commit in our branch. AFAICT, the issue was triggered by LTO. So something like the following seems fixes it (I haven't finished the end-to-end test yet). Does this change make sense to you?
if the end-to-end works, please send it as a patch to the mailing list.
Thanks! :)
Thanks again, Song
diff --git i/arch/x86/purgatory/Makefile w/arch/x86/purgatory/Makefile index 8f71aaa04cc2..dc306fa7197d 100644 --- i/arch/x86/purgatory/Makefile +++ w/arch/x86/purgatory/Makefile @@ -19,6 +19,10 @@ CFLAGS_sha256.o := -D__DISABLE_EXPORTS # optimization flags. KBUILD_CFLAGS := $(filter-out -fprofile-sample-use=% -fprofile-use=%,$(KBUILD_CFLAGS))
+# When LTO is enabled, llvm emits many text sections, which is not supported +# by kexec. Remove -flto=* flags. +KBUILD_CFLAGS := $(filter-out -flto=%,$(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 := -e purgatory_start -z nodefaultlib