Re: [PATCH] MIPS: kexec: Add crashkernel=YM handling

From: Jiaxun Yang
Date: Sat Sep 19 2020 - 03:11:36 EST




于 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;