于 2020年9月19日 GMT+08:00 上午9:55:46, Youling Tang <tangyoul...@loongson.cn> 写到:
>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 <tangyoul...@loongson.cn>
>---
> 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;

Reply via email to