于 2020年9月19日 GMT+08:00 上午9:55:46, Youling Tang <tangyouling@xxxxxxxxxxx> 写到: >When the kernel crashkernel parameter is specified with just a size, >we are supposed to allocate a region from RAM to store the crashkernel. >However, MIPS merely reserves physical address zero with no checking >that there is even RAM there. > >Fix this by lifting similar code from x86, importing it to MIPS with the >MIPS specific parameters added. In the absence of any platform specific >information, we allocate the crashkernel region from the first 512MB of >physical memory (limited to CKSEG0 or KSEG0 address range). > >When X is not specified, crash_base defaults to 0 (crashkernel=YM@XM). > >E.g. without this patch: > >The environment as follows: >[ 0.000000] MIPS: machine is loongson,loongson64c-4core-ls7a >... >[ 0.000000] Kernel command line: root=/dev/sda2 crashkernel=96M ... > >The warning as follows: >[ 0.000000] Invalid memory region reserved for crash kernel > >And the iomem as follows: >00200000-0effffff : System RAM > 00200000-00b47f87 : Kernel code > 00b47f88-00dfffff : Kernel data > 00e60000-01f73c7f : Kernel bss >1a000000-1bffffff : pci@1a000000 >... > >With this patch: > >After increasing crash_base <= 0 handling. > >And the iomem as follows: >00200000-0effffff : System RAM > 00200000-00b47f87 : Kernel code > 00b47f88-00dfffff : Kernel data > 00e60000-01f73c7f : Kernel bss > 04000000-09ffffff : Crash kernel >1a000000-1bffffff : pci@1a000000 >... > >Signed-off-by: Youling Tang <tangyouling@xxxxxxxxxxx> >--- > arch/mips/kernel/setup.c | 24 +++++++++++++++++++++--- > 1 file changed, 21 insertions(+), 3 deletions(-) > >diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c >index bf5f5ac..59a88ea 100644 >--- a/arch/mips/kernel/setup.c >+++ b/arch/mips/kernel/setup.c >@@ -477,6 +477,11 @@ early_param("elfcorehdr", early_parse_elfcorehdr); > #endif > > #ifdef CONFIG_KEXEC >+ >+/* 64M alignment for crash kernel regions */ >+#define CRASH_ALIGN SZ_64M >+#define CRASH_ADDR_MAX SZ_512M Hi Youling How do you determine the alignment requirement? Can we relax it? Thanks. - Jiaxun >+ > static void __init mips_parse_crashkernel(void) > { > unsigned long long total_mem; >@@ -489,9 +494,22 @@ static void __init mips_parse_crashkernel(void) > if (ret != 0 || crash_size <= 0) > return; > >- if (!memblock_find_in_range(crash_base, crash_base + crash_size, crash_size, 1)) { >- pr_warn("Invalid memory region reserved for crash kernel\n"); >- return; >+ if (crash_base <= 0) { >+ crash_base = memblock_find_in_range(CRASH_ALIGN, CRASH_ADDR_MAX, >+ crash_size, CRASH_ALIGN); >+ if (!crash_base) { >+ pr_warn("crashkernel reservation failed - No suitable area found.\n"); >+ return; >+ } >+ } else { >+ unsigned long long start; >+ >+ start = memblock_find_in_range(crash_base, crash_base + crash_size, >+ crash_size, 1); >+ if (start != crash_base) { >+ pr_warn("Invalid memory region reserved for crash kernel\n"); >+ return; >+ } > } > > crashk_res.start = crash_base;