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...
(assuming x86)
Regards
Please help us fix this properly (as I really don't know much about kexec).
Thanks in advance, Song
Here is readelf -S output on purgatory.ro.
With LTO:
readelf -W -S purgatory.ro There are 48 section headers, starting at offset 0x4a10:
Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 0000000000000000 000040 0000d0 00 AX 0 0 16 [ 2] .data PROGBITS 0000000000000000 001000 001000 00 WA 0 0 4096 [ 3] .rela.text RELA 0000000000000000 003788 000228 18 I 45 1 8 [ 4] .rodata PROGBITS 0000000000000000 002000 0000e0 00 A 0 0 16 [ 5] .rela.rodata RELA 0000000000000000 0039b0 000030 18 I 45 4 8 [ 6] .bss NOBITS 0000000000000000 0020e0 001000 00 WA 0 0 4096 [ 7] .text.purgatory PROGBITS 0000000000000000 0020e0 0000df 00 AX 0 0 16 [ 8] .rela.text.purgatory RELA 0000000000000000 0039e0 000060 18 I 45 7 8 [ 9] .text.warn PROGBITS 0000000000000000 0021c0 000001 00 AX 0 0 16 [10] .kexec-purgatory PROGBITS 0000000000000000 0021d0 000120 00 WA 0 0 16 [11] .comment PROGBITS 0000000000000000 003a40 000046 01 MS 0 0 1 [12] .llvm_addrsig LOOS+0xfff4c03 0000000000000000 003a86 000005 00 E 0 0 1 [13] .text.sha256_update PROGBITS 0000000000000000 0022f0 0008eb 00 AX 0 0 16 [14] .rela.text.sha256_update RELA 0000000000000000 003a90 000060 18 I 45 13 8 [15] .text.sha224_update PROGBITS 0000000000000000 002be0 00000c 00 AX 0 0 16 [16] .rela.text.sha224_update RELA 0000000000000000 003af0 000018 18 I 45 15 8 [17] .text.sha256_final PROGBITS 0000000000000000 002bf0 0000cd 00 AX 0 0 16 [18] .rela.text.sha256_final RELA 0000000000000000 003b08 000030 18 I 45 17 8 [19] .text.sha224_final PROGBITS 0000000000000000 002cc0 0000bd 00 AX 0 0 16 [20] .rela.text.sha224_final RELA 0000000000000000 003b38 000030 18 I 45 19 8 [21] .text.sha256 PROGBITS 0000000000000000 002d80 00011d 00 AX 0 0 16 [22] .rela.text.sha256 RELA 0000000000000000 003b68 000030 18 I 45 21 8 [23] .modinfo PROGBITS 0000000000000000 002e9d 000039 00 A 0 0 1 [24] .rodata.SHA256_K PROGBITS 0000000000000000 002ee0 000100 00 A 0 0 16 [25] .rodata.__sha256_final.padding PROGBITS 0000000000000000 002fe0 000040 00 A 0 0 16 [26] .text.memcmp PROGBITS 0000000000000000 003020 00000b 00 AX 0 0 16 [27] .text.bcmp PROGBITS 0000000000000000 003030 00000b 00 AX 0 0 16 [28] .text.strcmp PROGBITS 0000000000000000 003040 000041 00 AX 0 0 16 [29] .text.strncmp PROGBITS 0000000000000000 003090 00003a 00 AX 0 0 16 [30] .text.strnlen PROGBITS 0000000000000000 0030d0 000039 00 AX 0 0 16 [31] .text.atou PROGBITS 0000000000000000 003110 000035 00 AX 0 0 16 [32] .text.simple_strtoull PROGBITS 0000000000000000 003150 0000b6 00 AX 0 0 16 [33] .text.simple_strtol PROGBITS 0000000000000000 003210 0001b6 00 AX 0 0 16 [34] .text.strlen PROGBITS 0000000000000000 0033d0 00001c 00 AX 0 0 16 [35] .text.strstr PROGBITS 0000000000000000 0033f0 00005f 00 AX 0 0 16 [36] .text.strchr PROGBITS 0000000000000000 003450 000022 00 AX 0 0 16 [37] .text.kstrtoull PROGBITS 0000000000000000 003480 000142 00 AX 0 0 16 [38] .text.boot_kstrtoul PROGBITS 0000000000000000 0035d0 00000c 00 AX 0 0 16 [39] .rela.text.boot_kstrtoul RELA 0000000000000000 003b98 000018 18 I 45 38 8 [40] .text.memset PROGBITS 0000000000000000 0035e0 00001f 00 AX 0 0 16 [41] .text.memmove PROGBITS 0000000000000000 003600 0000a6 00 AX 0 0 16 [42] .text.memcpy PROGBITS 0000000000000000 0036b0 0000a6 00 AX 0 0 16 [43] .rodata.str1.1 PROGBITS 0000000000000000 003756 000032 01 AMS 0 0 1 [44] .note.GNU-stack PROGBITS 0000000000000000 003bb0 000000 00 0 0 1 [45] .symtab SYMTAB 0000000000000000 003bb0 000948 18 47 68 8 [46] .shstrtab STRTAB 0000000000000000 0044f8 0002cd 00 0 0 1 [47] .strtab STRTAB 0000000000000000 0047c5 000248 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), I (info), L (link order), O (extra OS processing required), G (group), T (TLS), C (compressed), x (unknown), o (OS specific), E (exclude), l (large), p (processor specific)
Without LTO:
readelf -W -S purgatory.ro There are 16 section headers, starting at offset 0x4130:
Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 0000000000000000 000040 00131b 00 AX 0 0 16 [ 2] .rela.text RELA 0000000000000000 003290 000480 18 I 13 1 8 [ 3] .kexec-purgatory PROGBITS 0000000000000000 001360 000120 00 WA 0 0 16 [ 4] .comment PROGBITS 0000000000000000 003710 000046 01 MS 0 0 1 [ 5] .llvm_addrsig LOOS+0xfff4c03 0000000000000000 003756 000005 00 E 0 0 1 [ 6] .data PROGBITS 0000000000000000 002000 001000 00 WA 0 0 4096 [ 7] .rodata PROGBITS 0000000000000000 003000 000220 00 A 0 0 16 [ 8] .rela.rodata RELA 0000000000000000 003760 000030 18 I 13 7 8 [ 9] .bss NOBITS 0000000000000000 003220 001000 00 WA 0 0 4096 [10] .modinfo PROGBITS 0000000000000000 003220 000039 00 A 0 0 1 [11] .rodata.str1.1 PROGBITS 0000000000000000 003259 000032 01 AMS 0 0 1 [12] .note.GNU-stack PROGBITS 0000000000000000 003790 000000 00 0 0 1 [13] .symtab SYMTAB 0000000000000000 003790 0006d8 18 15 43 8 [14] .shstrtab STRTAB 0000000000000000 003e68 00009c 00 0 0 1 [15] .strtab STRTAB 0000000000000000 003f04 00022b 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), I (info), L (link order), O (extra OS processing required), G (group), T (TLS), C (compressed), x (unknown), o (OS specific), E (exclude), l (large), p (processor specific)
[...]
Ricardo Ribalda (4): kexec: Support purgatories with .text.hot sections x86/purgatory: Remove PGO flags powerpc/purgatory: Remove PGO flags riscv/purgatory: Remove PGO flags
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 Delgado ribalda@chromium.org