[PATCH v4 10/12] crash: Introduce crash_extra_elfcorehdr_size() helper
From: Jinjie Ruan <hidden>
Date: 2026-09-07 12:53:42
Also in:
kexec, linux-fsdevel, linux-mm, lkml, loongarch
Subsystem:
kdump, linux for powerpc (32-bit and 64-bit), the rest · Maintainers:
Andrew Morton, Baoquan He, Mike Rapoport, Pasha Tatashin, Pratyush Yadav, Madhavan Srinivasan, Linus Torvalds
Extract the elfcorehdr extra space calculation from powerpc into a generic helper crash_extra_elfcorehdr_size() for use by other architectures like arm64. Strengthen the original powerpc check: instead of only checking the loose CONFIG_CRASH_MAX_MEMORY_RANGES, the new helper enforces a strict compile-time BUILD_BUG_ON() to guarantee that the absolute maximum theoretical number of ELF Program Headers will never exceed the ELF physical limit of PN_XNUM. This ensures absolute safety across all architectures with zero runtime overhead. The helper also provides a zero-size stub when crash memory hotplug is disabled. Cc: Madhavan Srinivasan <maddy@linux.ibm.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: "Christophe Leroy (CS GROUP)" <chleroy@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Baoquan He <baoquan.he@linux.dev> Cc: Mike Rapoport <rppt@kernel.org> Cc: Pasha Tatashin <pasha.tatashin@soleen.com> Cc: Pratyush Yadav <pratyush@kernel.org> Cc: Dave Young <ruirui.yang@linux.dev> Cc: Sourabh Jain <redacted> Signed-off-by: Jinjie Ruan <redacted> --- arch/powerpc/kexec/file_load_64.c | 19 +------------------ include/linux/crash_core.h | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/arch/powerpc/kexec/file_load_64.c b/arch/powerpc/kexec/file_load_64.c
index 6075b1c88511..2b0325e4a628 100644
--- a/arch/powerpc/kexec/file_load_64.c
+++ b/arch/powerpc/kexec/file_load_64.c@@ -374,23 +374,6 @@ static int load_backup_segment(struct kimage *image, struct kexec_buf *kbuf) return 0; } -static unsigned int kdump_extra_elfcorehdr_size(struct crash_mem *cmem) -{ -#if defined(CONFIG_CRASH_HOTPLUG) && defined(CONFIG_MEMORY_HOTPLUG) - unsigned int extra_sz = 0; - - if (CONFIG_CRASH_MAX_MEMORY_RANGES > (unsigned int)PN_XNUM) - pr_warn("Number of Phdrs %u exceeds max\n", CONFIG_CRASH_MAX_MEMORY_RANGES); - else if (cmem->nr_ranges >= CONFIG_CRASH_MAX_MEMORY_RANGES) - pr_warn("Configured crash mem ranges may not be enough\n"); - else - extra_sz = (CONFIG_CRASH_MAX_MEMORY_RANGES - cmem->nr_ranges) * sizeof(Elf64_Phdr); - - return extra_sz; -#endif - return 0; -} - /** * load_elfcorehdr_segment - Setup crash memory ranges and initialize elfcorehdr * segment needed to load kdump kernel.
@@ -428,7 +411,7 @@ static int load_elfcorehdr_segment(struct kimage *image, struct kexec_buf *kbuf) * Account for extra space required to accommodate additional memory * ranges in elfcorehdr due to memory hotplug events. */ - kbuf->memsz = headers_sz + kdump_extra_elfcorehdr_size(cmem); + kbuf->memsz = headers_sz + crash_extra_elfcorehdr_size(cmem->nr_ranges); kbuf->top_down = false; ret = kexec_add_buffer(kbuf);
diff --git a/include/linux/crash_core.h b/include/linux/crash_core.h
index a68c0a6346f4..b447facf37cc 100644
--- a/include/linux/crash_core.h
+++ b/include/linux/crash_core.h@@ -106,4 +106,24 @@ ssize_t dm_crypt_keys_read(char *buf, size_t count, u64 *ppos); static inline int crash_load_dm_crypt_keys(struct kimage *image) {return 0; } #endif +#if defined(CONFIG_CRASH_HOTPLUG) && defined(CONFIG_MEMORY_HOTPLUG) +static inline unsigned int crash_extra_elfcorehdr_size(unsigned int nr_mem_ranges) +{ + BUILD_BUG_ON((2 + CONFIG_NR_CPUS + CONFIG_CRASH_MAX_MEMORY_RANGES) >= + (unsigned int)PN_XNUM); + + if (nr_mem_ranges >= CONFIG_CRASH_MAX_MEMORY_RANGES) { + pr_warn_once("Configured crash mem ranges may not be enough\n"); + return 0; + } + + return (CONFIG_CRASH_MAX_MEMORY_RANGES - nr_mem_ranges) * sizeof(Elf64_Phdr); +} +#else +static inline unsigned int crash_extra_elfcorehdr_size(unsigned int nr_mem_ranges) +{ + return 0; +} +#endif + #endif /* LINUX_CRASH_CORE_H */
--
2.34.1