Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arch, crash: move arch_crash_save_vmcoreinfo() out to file vmcore_info.c

Nathan reported below building error:

=====
$ curl -LSso .config https://git.alpinelinux.org/aports/plain/community/linux-edge/config-edge.armv7
$ make -skj"$(nproc)" ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- olddefconfig all
..
arm-linux-gnueabi-ld: arch/arm/kernel/machine_kexec.o: in function `arch_crash_save_vmcoreinfo':
machine_kexec.c:(.text+0x488): undefined reference to `vmcoreinfo_append_str'
====

On architecutres, like arm, s390, ppc, sh, function
arch_crash_save_vmcoreinfo() is located in machine_kexec.c and it can
only be compiled in when CONFIG_KEXEC_CORE=y.

That's not right because arch_crash_save_vmcoreinfo() is used to export
arch specific vmcoreinfo. CONFIG_VMCORE_INFO is supposed to control its
compiling in. However, CONFIG_VMVCORE_INFO could be independent of
CONFIG_KEXEC_CORE, e.g CONFIG_PROC_KCORE=y will select CONFIG_VMVCORE_INFO.
Or CONFIG_KEXEC/CONFIG_KEXEC_FILE is set while CONFIG_CRASH_DUMP is
not set, it will report linking error.

So, on arm, s390, ppc and sh, move arch_crash_save_vmcoreinfo out to
a new file vmcore_info.c. Let CONFIG_VMCORE_INFO decide if compiling in
arch_crash_save_vmcoreinfo().

[akpm@linux-foundation.org: remove stray newlines at eof]
Link: https://lkml.kernel.org/r/20240129135033.157195-3-bhe@redhat.com
Signed-off-by: Baoquan He <bhe@redhat.com>
Reported-by: Nathan Chancellor <nathan@kernel.org>
Closes: https://lore.kernel.org/all/20240126045551.GA126645@dev-arch.thelio-3990X/T/#u
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Eric W. Biederman <ebiederm@xmission.com>
Cc: Hari Bathini <hbathini@linux.ibm.com>
Cc: Klara Modin <klarasmodin@gmail.com>
Cc: Michael Kelley <mhklinux@outlook.com>
Cc: Pingfan Liu <piliu@redhat.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Yang Li <yang.lee@linux.alibaba.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Baoquan He and committed by
Andrew Morton
199da871 ea034d0b

+82 -61
+1
arch/arm/kernel/Makefile
··· 60 60 obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o insn.o patch.o 61 61 obj-$(CONFIG_JUMP_LABEL) += jump_label.o insn.o patch.o 62 62 obj-$(CONFIG_KEXEC_CORE) += machine_kexec.o relocate_kernel.o 63 + obj-$(CONFIG_VMCORE_INFO) += vmcore_info.o 63 64 # Main staffs in KPROBES are in arch/arm/probes/ . 64 65 obj-$(CONFIG_KPROBES) += patch.o insn.o 65 66 obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o
-7
arch/arm/kernel/machine_kexec.c
··· 198 198 199 199 soft_restart(reboot_entry_phys); 200 200 } 201 - 202 - void arch_crash_save_vmcoreinfo(void) 203 - { 204 - #ifdef CONFIG_ARM_LPAE 205 - VMCOREINFO_CONFIG(ARM_LPAE); 206 - #endif 207 - }
+10
arch/arm/kernel/vmcore_info.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + 3 + #include <linux/vmcore_info.h> 4 + 5 + void arch_crash_save_vmcoreinfo(void) 6 + { 7 + #ifdef CONFIG_ARM_LPAE 8 + VMCOREINFO_CONFIG(ARM_LPAE); 9 + #endif 10 + }
+1
arch/powerpc/kexec/Makefile
··· 8 8 obj-$(CONFIG_PPC32) += relocate_32.o 9 9 10 10 obj-$(CONFIG_KEXEC_FILE) += file_load.o ranges.o file_load_$(BITS).o elf_$(BITS).o 11 + obj-$(CONFIG_VMCORE_INFO) += vmcore_info.o 11 12 12 13 # Disable GCOV, KCOV & sanitizers in odd or sensitive code 13 14 GCOV_PROFILE_core_$(BITS).o := n
-28
arch/powerpc/kexec/core.c
··· 53 53 { 54 54 } 55 55 56 - void arch_crash_save_vmcoreinfo(void) 57 - { 58 - 59 - #ifdef CONFIG_NUMA 60 - VMCOREINFO_SYMBOL(node_data); 61 - VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); 62 - #endif 63 - #ifndef CONFIG_NUMA 64 - VMCOREINFO_SYMBOL(contig_page_data); 65 - #endif 66 - #if defined(CONFIG_PPC64) && defined(CONFIG_SPARSEMEM_VMEMMAP) 67 - VMCOREINFO_SYMBOL(vmemmap_list); 68 - VMCOREINFO_SYMBOL(mmu_vmemmap_psize); 69 - VMCOREINFO_SYMBOL(mmu_psize_defs); 70 - VMCOREINFO_STRUCT_SIZE(vmemmap_backing); 71 - VMCOREINFO_OFFSET(vmemmap_backing, list); 72 - VMCOREINFO_OFFSET(vmemmap_backing, phys); 73 - VMCOREINFO_OFFSET(vmemmap_backing, virt_addr); 74 - VMCOREINFO_STRUCT_SIZE(mmu_psize_def); 75 - VMCOREINFO_OFFSET(mmu_psize_def, shift); 76 - #endif 77 - VMCOREINFO_SYMBOL(cur_cpu_spec); 78 - VMCOREINFO_OFFSET(cpu_spec, cpu_features); 79 - VMCOREINFO_OFFSET(cpu_spec, mmu_features); 80 - vmcoreinfo_append_str("NUMBER(RADIX_MMU)=%d\n", early_radix_enabled()); 81 - vmcoreinfo_append_str("KERNELOFFSET=%lx\n", kaslr_offset()); 82 - } 83 - 84 56 /* 85 57 * Do not allocate memory (or fail in any way) in machine_kexec(). 86 58 * We are past the point of no return, committed to rebooting now.
+32
arch/powerpc/kexec/vmcore_info.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + 3 + #include <linux/vmcore_info.h> 4 + #include <asm/pgalloc.h> 5 + 6 + void arch_crash_save_vmcoreinfo(void) 7 + { 8 + 9 + #ifdef CONFIG_NUMA 10 + VMCOREINFO_SYMBOL(node_data); 11 + VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); 12 + #endif 13 + #ifndef CONFIG_NUMA 14 + VMCOREINFO_SYMBOL(contig_page_data); 15 + #endif 16 + #if defined(CONFIG_PPC64) && defined(CONFIG_SPARSEMEM_VMEMMAP) 17 + VMCOREINFO_SYMBOL(vmemmap_list); 18 + VMCOREINFO_SYMBOL(mmu_vmemmap_psize); 19 + VMCOREINFO_SYMBOL(mmu_psize_defs); 20 + VMCOREINFO_STRUCT_SIZE(vmemmap_backing); 21 + VMCOREINFO_OFFSET(vmemmap_backing, list); 22 + VMCOREINFO_OFFSET(vmemmap_backing, phys); 23 + VMCOREINFO_OFFSET(vmemmap_backing, virt_addr); 24 + VMCOREINFO_STRUCT_SIZE(mmu_psize_def); 25 + VMCOREINFO_OFFSET(mmu_psize_def, shift); 26 + #endif 27 + VMCOREINFO_SYMBOL(cur_cpu_spec); 28 + VMCOREINFO_OFFSET(cpu_spec, cpu_features); 29 + VMCOREINFO_OFFSET(cpu_spec, mmu_features); 30 + vmcoreinfo_append_str("NUMBER(RADIX_MMU)=%d\n", early_radix_enabled()); 31 + vmcoreinfo_append_str("KERNELOFFSET=%lx\n", kaslr_offset()); 32 + }
+1
arch/s390/kernel/Makefile
··· 64 64 obj-$(CONFIG_FUNCTION_TRACER) += mcount.o 65 65 obj-$(CONFIG_CRASH_DUMP) += crash_dump.o 66 66 obj-$(CONFIG_KEXEC_CORE) += machine_kexec.o relocate_kernel.o 67 + obj-$(CONFIG_VMCORE_INFO) += vmcore_info.o 67 68 obj-$(CONFIG_UPROBES) += uprobes.o 68 69 obj-$(CONFIG_JUMP_LABEL) += jump_label.o 69 70
-15
arch/s390/kernel/machine_kexec.c
··· 209 209 { 210 210 } 211 211 212 - void arch_crash_save_vmcoreinfo(void) 213 - { 214 - struct lowcore *abs_lc; 215 - 216 - VMCOREINFO_SYMBOL(lowcore_ptr); 217 - VMCOREINFO_SYMBOL(high_memory); 218 - VMCOREINFO_LENGTH(lowcore_ptr, NR_CPUS); 219 - vmcoreinfo_append_str("SAMODE31=%lx\n", (unsigned long)__samode31); 220 - vmcoreinfo_append_str("EAMODE31=%lx\n", (unsigned long)__eamode31); 221 - vmcoreinfo_append_str("KERNELOFFSET=%lx\n", kaslr_offset()); 222 - abs_lc = get_abs_lowcore(); 223 - abs_lc->vmcore_info = paddr_vmcoreinfo_note(); 224 - put_abs_lowcore(abs_lc); 225 - } 226 - 227 212 void machine_shutdown(void) 228 213 { 229 214 }
+21
arch/s390/kernel/vmcore_info.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + 3 + #include <linux/vmcore_info.h> 4 + #include <asm/abs_lowcore.h> 5 + #include <linux/mm.h> 6 + #include <asm/setup.h> 7 + 8 + void arch_crash_save_vmcoreinfo(void) 9 + { 10 + struct lowcore *abs_lc; 11 + 12 + VMCOREINFO_SYMBOL(lowcore_ptr); 13 + VMCOREINFO_SYMBOL(high_memory); 14 + VMCOREINFO_LENGTH(lowcore_ptr, NR_CPUS); 15 + vmcoreinfo_append_str("SAMODE31=%lx\n", (unsigned long)__samode31); 16 + vmcoreinfo_append_str("EAMODE31=%lx\n", (unsigned long)__eamode31); 17 + vmcoreinfo_append_str("KERNELOFFSET=%lx\n", kaslr_offset()); 18 + abs_lc = get_abs_lowcore(); 19 + abs_lc->vmcore_info = paddr_vmcoreinfo_note(); 20 + put_abs_lowcore(abs_lc); 21 + }
+1
arch/sh/kernel/Makefile
··· 34 34 obj-$(CONFIG_KGDB) += kgdb.o 35 35 obj-$(CONFIG_MODULES) += sh_ksyms_32.o module.o 36 36 obj-$(CONFIG_KEXEC_CORE) += machine_kexec.o relocate_kernel.o 37 + obj-$(CONFIG_VMCORE_INFO) += vmcore_info.o 37 38 obj-$(CONFIG_CRASH_DUMP) += crash_dump.o 38 39 obj-$(CONFIG_STACKTRACE) += stacktrace.o 39 40 obj-$(CONFIG_IO_TRAPPED) += io_trapped.o
-11
arch/sh/kernel/machine_kexec.c
··· 137 137 __ftrace_enabled_restore(save_ftrace_enabled); 138 138 } 139 139 140 - void arch_crash_save_vmcoreinfo(void) 141 - { 142 - #ifdef CONFIG_NUMA 143 - VMCOREINFO_SYMBOL(node_data); 144 - VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); 145 - #endif 146 - #ifdef CONFIG_X2TLB 147 - VMCOREINFO_CONFIG(X2TLB); 148 - #endif 149 - } 150 - 151 140 void __init reserve_crashkernel(void) 152 141 { 153 142 unsigned long long crash_size, crash_base;
+15
arch/sh/kernel/vmcore_info.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + 3 + #include <linux/vmcore_info.h> 4 + #include <linux/mm.h> 5 + 6 + void arch_crash_save_vmcoreinfo(void) 7 + { 8 + #ifdef CONFIG_NUMA 9 + VMCOREINFO_SYMBOL(node_data); 10 + VMCOREINFO_LENGTH(node_data, MAX_NUMNODES); 11 + #endif 12 + #ifdef CONFIG_X2TLB 13 + VMCOREINFO_CONFIG(X2TLB); 14 + #endif 15 + }