• Youling Tang's avatar
    LoongArch: Use generic interface to support crashkernel=X,[high,low] · 78de91b4
    Youling Tang authored
    LoongArch already supports two crashkernel regions in kexec-tools, so we
    can directly use the common interface to support crashkernel=X,[high,low]
    after commit 0ab97169 ("crash_core: add generic function to do
    reservation").
    
    With the help of newly changed function parse_crashkernel() and generic
    reserve_crashkernel_generic(), crashkernel reservation can be simplified
    by steps:
    
    1) Add a new header file <asm/crash_core.h>, then define CRASH_ALIGN,
       CRASH_ADDR_LOW_MAX and CRASH_ADDR_HIGH_MAX and in <asm/crash_core.h>;
    
    2) Add arch_reserve_crashkernel() to call parse_crashkernel() and
       reserve_crashkernel_generic();
    
    3) Add ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION Kconfig in
       arch/loongarch/Kconfig.
    
    One can reserve the crash kernel from high memory above DMA zone range
    by explicitly passing "crashkernel=X,high"; or reserve a memory range
    below 4G with "crashkernel=X,low". Besides, there are few rules need to
    take notice:
    
    1) "crashkernel=X,[high,low]" will be ignored if "crashkernel=size" is
       specified.
    2) "crashkernel=X,low" is valid only when "crashkernel=X,high" is passed
       and there is enough memory to be allocated under 4G.
    3) When allocating crashkernel above 4G and no "crashkernel=X,low" is
       specified, a 128M low memory will be allocated automatically for
       swiotlb bounce buffer.
    See Documentation/admin-guide/kernel-parameters.txt for more information.
    
    Following test cases have been performed as expected:
    1) crashkernel=256M                          //low=256M
    2) crashkernel=1G                            //low=1G
    3) crashkernel=4G                            //high=4G, low=128M(default)
    4) crashkernel=4G crashkernel=256M,high      //high=4G, low=128M(default), high is ignored
    5) crashkernel=4G crashkernel=256M,low       //high=4G, low=128M(default), low is ignored
    6) crashkernel=4G,high                       //high=4G, low=128M(default)
    7) crashkernel=256M,low                      //low=0M, invalid
    8) crashkernel=4G,high crashkernel=256M,low  //high=4G, low=256M
    9) crashkernel=4G,high crashkernel=4G,low    //high=0M, low=0M, invalid
    10) crashkernel=512M@2560M                   //low=512M
    11) crashkernel=1G,high crashkernel=0M,low   //high=1G, low=0M
    
    Recommended usage in general:
    1) In the case of small memory: crashkernel=512M
    2) In the case of large memory: crashkernel=1024M,high crashkernel=128M,low
    Signed-off-by: default avatarYouling Tang <tangyouling@kylinos.cn>
    Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    78de91b4
crash_core.h 280 Bytes