| From: Jinjie Ruan <ruanjinjie@huawei.com> |
| Subject: crash: fix riscv64 crash memory reserve dead loop |
| Date: Mon, 12 Aug 2024 14:20:17 +0800 |
| |
| On RISCV64 Qemu machine with 512MB memory, cmdline "crashkernel=500M,high" |
| will cause system stall as below: |
| |
| Zone ranges: |
| DMA32 [mem 0x0000000080000000-0x000000009fffffff] |
| Normal empty |
| Movable zone start for each node |
| Early memory node ranges |
| node 0: [mem 0x0000000080000000-0x000000008005ffff] |
| node 0: [mem 0x0000000080060000-0x000000009fffffff] |
| Initmem setup node 0 [mem 0x0000000080000000-0x000000009fffffff] |
| (stall here) |
| |
| commit 5d99cadf1568 ("crash: fix x86_32 crash memory reserve dead loop |
| bug") fix this on 32-bit architecture. However, the problem is not |
| completely solved. If `CRASH_ADDR_LOW_MAX = CRASH_ADDR_HIGH_MAX` on |
| 64-bit architecture, for example, when system memory is equal to |
| CRASH_ADDR_LOW_MAX on RISCV64, the following infinite loop will also |
| occur: |
| |
| -> reserve_crashkernel_generic() and high is true |
| -> alloc at [CRASH_ADDR_LOW_MAX, CRASH_ADDR_HIGH_MAX] fail |
| -> alloc at [0, CRASH_ADDR_LOW_MAX] fail and repeatedly |
| (because CRASH_ADDR_LOW_MAX = CRASH_ADDR_HIGH_MAX). |
| |
| As Catalin suggested, do not remove the ",high" reservation fallback to |
| ",low" logic which will change arm64's kdump behavior, but fix it by |
| skipping the above situation similar to commit d2f32f23190b ("crash: fix |
| x86_32 crash memory reserve dead loop"). |
| |
| After this patch, it print: |
| cannot allocate crashkernel (size:0x1f400000) |
| |
| Link: https://lkml.kernel.org/r/20240812062017.2674441-1-ruanjinjie@huawei.com |
| Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com> |
| Suggested-by: Catalin Marinas <catalin.marinas@arm.com> |
| Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> |
| Acked-by: Baoquan He <bhe@redhat.com> |
| Cc: Albert Ou <aou@eecs.berkeley.edu> |
| Cc: Dave Young <dyoung@redhat.com> |
| Cc: Palmer Dabbelt <palmer@dabbelt.com> |
| Cc: Paul Walmsley <paul.walmsley@sifive.com> |
| Cc: Vivek Goyal <vgoyal@redhat.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| kernel/crash_reserve.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/kernel/crash_reserve.c~crash-fix-riscv64-crash-memory-reserve-dead-loop |
| +++ a/kernel/crash_reserve.c |
| @@ -423,7 +423,8 @@ retry: |
| if (high && search_end == CRASH_ADDR_HIGH_MAX) { |
| search_end = CRASH_ADDR_LOW_MAX; |
| search_base = 0; |
| - goto retry; |
| + if (search_end != CRASH_ADDR_HIGH_MAX) |
| + goto retry; |
| } |
| pr_warn("cannot allocate crashkernel (size:0x%llx)\n", |
| crash_size); |
| _ |