lkml.org 
[lkml]   [2020]   [Sep]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] MIPS: kexec: Add crashkernel=YM handling


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

\
 
 \ /
  Last update: 2020-09-19 09:12    [W:0.090 / U:0.828 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site