• Baoquan He's avatar
    kexec: split crashkernel reservation code out from crash_core.c · 85fcde40
    Baoquan He authored
    Patch series "Split crash out from kexec and clean up related config
    items", v3.
    
    Motivation:
    =============
    Previously, LKP reported a building error. When investigating, it can't
    be resolved reasonablly with the present messy kdump config items.
    
     https://lore.kernel.org/oe-kbuild-all/202312182200.Ka7MzifQ-lkp@intel.com/
    
    The kdump (crash dumping) related config items could causes confusions:
    
    Firstly,
    
    CRASH_CORE enables codes including
     - crashkernel reservation;
     - elfcorehdr updating;
     - vmcoreinfo exporting;
     - crash hotplug handling;
    
    Now fadump of powerpc, kcore dynamic debugging and kdump all selects
    CRASH_CORE, while fadump
     - fadump needs crashkernel parsing, vmcoreinfo exporting, and accessing
       global variable 'elfcorehdr_addr';
     - kcore only needs vmcoreinfo exporting;
     - kdump needs all of the current kernel/crash_core.c.
    
    So only enabling PROC_CORE or FA_DUMP will enable CRASH_CORE, this
    mislead people that we enable crash dumping, actual it's not.
    
    Secondly,
    
    It's not reasonable to allow KEXEC_CORE select CRASH_CORE.
    
    Because KEXEC_CORE enables codes which allocate control pages, copy
    kexec/kdump segments, and prepare for switching. These codes are
    shared by both kexec reboot and kdump. We could want kexec reboot,
    but disable kdump. In that case, CRASH_CORE should not be selected.
    
     --------------------
     CONFIG_CRASH_CORE=y
     CONFIG_KEXEC_CORE=y
     CONFIG_KEXEC=y
     CONFIG_KEXEC_FILE=y
     ---------------------
    
    Thirdly,
    
    It's not reasonable to allow CRASH_DUMP select KEXEC_CORE.
    
    That could make KEXEC_CORE, CRASH_DUMP are enabled independently from
    KEXEC or KEXEC_FILE. However, w/o KEXEC or KEXEC_FILE, the KEXEC_CORE
    code built in doesn't make any sense because no kernel loading or
    switching will happen to utilize the KEXEC_CORE code.
     ---------------------
     CONFIG_CRASH_CORE=y
     CONFIG_KEXEC_CORE=y
     CONFIG_CRASH_DUMP=y
     ---------------------
    
    In this case, what is worse, on arch sh and arm, KEXEC relies on MMU,
    while CRASH_DUMP can still be enabled when !MMU, then compiling error is
    seen as the lkp test robot reported in above link.
    
     ------arch/sh/Kconfig------
     config ARCH_SUPPORTS_KEXEC
             def_bool MMU
    
     config ARCH_SUPPORTS_CRASH_DUMP
             def_bool BROKEN_ON_SMP
     ---------------------------
    
    Changes:
    ===========
    1, split out crash_reserve.c from crash_core.c;
    2, split out vmcore_infoc. from crash_core.c;
    3, move crash related codes in kexec_core.c into crash_core.c;
    4, remove dependency of FA_DUMP on CRASH_DUMP;
    5, clean up kdump related config items;
    6, wrap up crash codes in crash related ifdefs on all 8 arch-es
       which support crash dumping, except of ppc;
    
    Achievement:
    ===========
    With above changes, I can rearrange the config item logic as below (the right
    item depends on or is selected by the left item):
    
        PROC_KCORE -----------> VMCORE_INFO
    
                   |----------> VMCORE_INFO
        FA_DUMP----|
                   |----------> CRASH_RESERVE
    
                                                        ---->VMCORE_INFO
                                                       /
                                                       |---->CRASH_RESERVE
        KEXEC      --|                                /|
                     |--> KEXEC_CORE--> CRASH_DUMP-->/-|---->PROC_VMCORE
        KEXEC_FILE --|                               \ |
                                                       \---->CRASH_HOTPLUG
    
    
        KEXEC      --|
                     |--> KEXEC_CORE (for kexec reboot only)
        KEXEC_FILE --|
    
    Test
    ========
    On all 8 architectures, including x86_64, arm64, s390x, sh, arm, mips,
    riscv, loongarch, I did below three cases of config item setting and
    building all passed. Take configs on x86_64 as exampmle here:
    
    (1) Both CONFIG_KEXEC and KEXEC_FILE is unset, then all kexec/kdump
    items are unset automatically:
    # Kexec and crash features
    # CONFIG_KEXEC is not set
    # CONFIG_KEXEC_FILE is not set
    # end of Kexec and crash features
    
    (2) set CONFIG_KEXEC_FILE and 'make olddefconfig':
    ---------------
    # Kexec and crash features
    CONFIG_CRASH_RESERVE=y
    CONFIG_VMCORE_INFO=y
    CONFIG_KEXEC_CORE=y
    CONFIG_KEXEC_FILE=y
    CONFIG_CRASH_DUMP=y
    CONFIG_CRASH_HOTPLUG=y
    CONFIG_CRASH_MAX_MEMORY_RANGES=8192
    # end of Kexec and crash features
    ---------------
    
    (3) unset CONFIG_CRASH_DUMP in case 2 and execute 'make olddefconfig':
    ------------------------
    # Kexec and crash features
    CONFIG_KEXEC_CORE=y
    CONFIG_KEXEC_FILE=y
    # end of Kexec and crash features
    ------------------------
    
    Note:
    For ppc, it needs investigation to make clear how to split out crash
    code in arch folder. Hope Hari and Pingfan can help have a look, see if
    it's doable. Now, I make it either have both kexec and crash enabled, or
    disable both of them altogether.
    
    
    This patch (of 14):
    
    Both kdump and fa_dump of ppc rely on crashkernel reservation.  Move the
    relevant codes into separate files: crash_reserve.c,
    include/linux/crash_reserve.h.
    
    And also add config item CRASH_RESERVE to control its enabling of the
    codes.  And update config items which has relationship with crashkernel
    reservation.
    
    And also change ifdeffery from CONFIG_CRASH_CORE to CONFIG_CRASH_RESERVE
    when those scopes are only crashkernel reservation related.
    
    And also rename arch/XXX/include/asm/{crash_core.h => crash_reserve.h} on
    arm64, x86 and risc-v because those architectures' crash_core.h is only
    related to crashkernel reservation.
    
    [akpm@linux-foundation.org: s/CRASH_RESEERVE/CRASH_RESERVE/, per Klara Modin]
    Link: https://lkml.kernel.org/r/20240124051254.67105-1-bhe@redhat.com
    Link: https://lkml.kernel.org/r/20240124051254.67105-2-bhe@redhat.comSigned-off-by: default avatarBaoquan He <bhe@redhat.com>
    Acked-by: default avatarHari Bathini <hbathini@linux.ibm.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Cc: Pingfan Liu <piliu@redhat.com>
    Cc: Klara Modin <klarasmodin@gmail.com>
    Cc: Michael Kelley <mhklinux@outlook.com>
    Cc: Nathan Chancellor <nathan@kernel.org>
    Cc: Stephen Rothwell <sfr@canb.auug.org.au>
    Cc: Yang Li <yang.lee@linux.alibaba.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    85fcde40
Kconfig 32 KB