* [RESEND PATCH v8 0/8] kdump: reduce vmcore size and capture time
@ 2026-10-16 6:15 ` Wandun Chen
0 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
On SoCs that carve out large firmware-owned reserved memory (GPU,
camera ISP, ...), kdump currently dumps those carveouts as part of
system RAM even though their contents are firmware state that is not
useful for kernel crash analysis.
ACPI systems already filter reserved memory out of the vmcore through
their existing path: firmware reports those carveouts as unusable in
the EFI memory map, they get MEMBLOCK_NOMAP set in memblock.memory
(is_usable_memory(), efi-init.c), and the ELF header builder has
always skipped nomap regions; only DT-based systems currently fail
to filter these regions, which is what this series addresses.
This series introduces a MEMBLOCK_NODUMP flag (suggested by Rob) in
memblock to filter reserved memory on DT-based architectures. A new
flag is needed because MEMBLOCK_NOMAP can only express regions without
a linear mapping, while MEMBLOCK_NODUMP can filter regions that are
linearly mapped. Reserved regions are marked MEMBLOCK_NODUMP by default
so kdump omits them; reusable CMA regions are different because their
pages are handed back to the buddy allocator and may carry crash-relevant
data.
Since the reserved memory regions are filtered out, the vmcore is
smaller in size and faster to produce.
The series is based on linux-next and is organized as follows:
Patches 1-3: Preparation and bugfixes: switch riscv crash_mem to
memblock, fold the duplicated per-arch memblock walks
into the weak defaults, and serialize crash header
preparation against memory hotplug.
Patches 4-7: NODUMP infrastructure: switch crash_core to
for_each_mem_region(), introduce the MEMBLOCK_NODUMP
flag, add a dumpable flag to struct reserved_mem, and
mark /reserved-memory entries with MEMBLOCK_NODUMP.
Patch 8: Skip MEMBLOCK_NODUMP regions when building the vmcore
ELF header.
v6 --> v8 (v7 mainly tried to fix the initrd issue on release in v6,
that approach is superseded here):
1. Stop marking /memreserve/ regions with NODUMP. v6 marked
/memreserve/ regions with NODUMP. But a bootloader may specify
a /memreserve/ entry for memory that the kernel later frees
(e.g. the initrd), and those pages would then be wrongly
filtered out of the vmcore after being reused as normal memory.
The v7 fix (clearing the flag in free_reserved_area()) caused
a lockless runtime mutation of memblock.memory [1]. Better solutions
exist but need extra preparation, so temporarily dropped the patch
that introduced the problem to keep this series simple in v8.
2. Fix a build failure in patch 2 with both ARCH_KEEP_MEMBLOCK and
MEMORY_HOTPLUG are unset. There the memblock arrays live in
.init.data, and the weak defaults referencing them create section
mismatches, which turn into build errors when SECTION_MISMATCH_WARN_ONLY
is also unset.
3. RISCV recently gained crash hotplug support, so adapt its handler
like x86 in patch 3: use __crash_prepare_headers() instead of
crash_prepare_headers() to avoid self-deadlock.
4. Update the cover letter per review feedback: describe how ACPI
systems filter reserved memory and why a new flag is needed
instead of reusing NOMAP.
Every patch in this series now carries an Acked-by or Reviewed-by tag.
Patches 2 and 3 have changed since v6, but the changes (a build fix and
a riscv hotplug adaptation) do not alter the logic the tags were given
for, so their tags are kept. If any tag should not be carried, please
let me know and I will drop it.
v6 --> v7:
1. Fix a stale MEMBLOCK_NODUMP flag issue [2]. Memory reserved and
marked as NODUMP may later be freed (the initrd, for example),
so the NODUMP flag must be cleared accordingly. Since the fix is
part of the NODUMP infrastructure introduced by patch 5, it has
been folded into that patch.
2. Drop the "generic" related description in the cover letter.
3. Collect the Acked-by and Reviewed-by tags received during the v6
review (thanks to Baoquan, Mike, Rob and Marek). Patch 5 is the
only one without a tag, as its Reviewed-by was dropped when the
fix was folded in.
4. Drop patch 1 of v6, which has been merged separately.
v5 --> v6:
1. Serialize crash header preparation against memory hotplug to avoid
out-of-bounds or use-after-free issues.
2. MEMBLOCK_NODUMP marking is now done after memblock allows resizing,
avoiding a panic from too few regions before resize is permitted.
3. Reordered the patches, put pre-existing bugfixes earlier in the series.
[1] https://lore.kernel.org/lkml/20260922090252.B01541F000FF@smtp.kernel.org/
[2] https://sashiko.dev/#/message/20260917220750.GA4013814-robh%40kernel.org
v5: https://lore.kernel.org/lkml/20260806093519.2907771-1-chenwandun1@gmail.com/
v4: https://lore.kernel.org/lkml/20260630074715.4126796-1-chenwandun1@gmail.com/
Wandun Chen (8):
riscv: build crash_mem ranges from memblock instead of resource tree
crash_core: fold duplicated memblock arch hooks into the weak default
crash_core: serialize crash header preparation against hotplug
crash_core: replace for_each_mem_range() with for_each_mem_region()
memblock: introduce MEMBLOCK_NODUMP flag
of: reserved_mem: add dumpable flag to opt-in vmcore
of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP
crash_core: skip MEMBLOCK_NODUMP regions when building vmcore ELF
header
arch/arm64/kernel/machine_kexec_file.c | 29 ------------
arch/loongarch/kernel/machine_kexec_file.c | 27 -----------
arch/riscv/Kconfig | 2 +-
arch/riscv/kernel/crash.c | 2 +-
arch/riscv/kernel/machine_kexec_file.c | 33 --------------
arch/x86/kernel/crash.c | 2 +-
drivers/of/fdt.c | 1 +
drivers/of/of_private.h | 1 +
drivers/of/of_reserved_mem.c | 15 ++++++
include/linux/crash_core.h | 2 +
include/linux/memblock.h | 9 ++++
include/linux/of_reserved_mem.h | 1 +
kernel/crash_core.c | 53 +++++++++++++++++++++-
kernel/dma/contiguous.c | 1 +
mm/memblock.c | 16 +++++++
15 files changed, 100 insertions(+), 94 deletions(-)
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 26+ messages in thread* [RESEND PATCH v8 1/8] riscv: build crash_mem ranges from memblock instead of resource tree
2026-10-16 6:15 ` Wandun Chen
@ 2026-10-16 6:15 ` Wandun Chen
-1 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
Replace walk_system_ram_res() with for_each_mem_range(). A later patch
introduces MEMBLOCK_NODUMP in memblock, the reserved-memory regions
marked with MEMBLOCK_NODUMP can be excluded from the vmcore by walking
memblock.
for_each_mem_range() iterates memblock.memory, which is freed after
init unless ARCH_KEEP_MEMBLOCK is selected. riscv needs ARCH_KEEP_MEMBLOCK
to filter reserved memory from the vmcore, so extend its condition
(ACPI || KEXEC) with CRASH_DUMP. arm64 and loongarch already select
ARCH_KEEP_MEMBLOCK unconditionally.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Baoquan He <baoquan.he@linux.dev>
---
arch/riscv/Kconfig | 2 +-
arch/riscv/kernel/machine_kexec_file.c | 31 ++++++++++----------------
2 files changed, 13 insertions(+), 20 deletions(-)
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 62a4be0474e3..529310e3ae1e 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -58,7 +58,7 @@ config RISCV
select ARCH_HAS_UBSAN
select ARCH_HAS_VDSO_ARCH_DATA
select ARCH_HAVE_NMI_SAFE_CMPXCHG
- select ARCH_KEEP_MEMBLOCK if ACPI || KEXEC
+ select ARCH_KEEP_MEMBLOCK if ACPI || KEXEC || CRASH_DUMP
select ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE if 64BIT && MMU
select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX
select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT
diff --git a/arch/riscv/kernel/machine_kexec_file.c b/arch/riscv/kernel/machine_kexec_file.c
index 26cd2a8bd0cd..808e872f4063 100644
--- a/arch/riscv/kernel/machine_kexec_file.c
+++ b/arch/riscv/kernel/machine_kexec_file.c
@@ -37,39 +37,32 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)
}
#ifdef CONFIG_CRASH_DUMP
-static int get_nr_ram_ranges_callback(struct resource *res, void *arg)
-{
- unsigned int *nr_ranges = arg;
-
- (*nr_ranges)++;
- return 0;
-}
-
unsigned int arch_get_system_nr_ranges(void)
{
unsigned int nr_ranges = 2 + crashk_cma_cnt; /* For exclusion of crashkernel region */
+ u64 i;
+ phys_addr_t start, end;
- walk_system_ram_res(0, -1, &nr_ranges, get_nr_ram_ranges_callback);
+ for_each_mem_range(i, &start, &end)
+ nr_ranges++;
return nr_ranges;
}
-static int prepare_elf64_ram_headers_callback(struct resource *res, void *arg)
+int arch_crash_populate_cmem(struct crash_mem *cmem)
{
- struct crash_mem *cmem = arg;
+ u64 i;
+ phys_addr_t start, end;
- cmem->ranges[cmem->nr_ranges].start = res->start;
- cmem->ranges[cmem->nr_ranges].end = res->end;
- cmem->nr_ranges++;
+ for_each_mem_range(i, &start, &end) {
+ cmem->ranges[cmem->nr_ranges].start = start;
+ cmem->ranges[cmem->nr_ranges].end = end - 1;
+ cmem->nr_ranges++;
+ }
return 0;
}
-int arch_crash_populate_cmem(struct crash_mem *cmem)
-{
- return walk_system_ram_res(0, -1, cmem, prepare_elf64_ram_headers_callback);
-}
-
static char *setup_kdump_cmdline(struct kimage *image, char *cmdline,
unsigned long cmdline_len)
{
--
2.43.0
^ permalink raw reply related [flat|nested] 26+ messages in thread* [RESEND PATCH v8 1/8] riscv: build crash_mem ranges from memblock instead of resource tree
@ 2026-10-16 6:15 ` Wandun Chen
0 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
Replace walk_system_ram_res() with for_each_mem_range(). A later patch
introduces MEMBLOCK_NODUMP in memblock, the reserved-memory regions
marked with MEMBLOCK_NODUMP can be excluded from the vmcore by walking
memblock.
for_each_mem_range() iterates memblock.memory, which is freed after
init unless ARCH_KEEP_MEMBLOCK is selected. riscv needs ARCH_KEEP_MEMBLOCK
to filter reserved memory from the vmcore, so extend its condition
(ACPI || KEXEC) with CRASH_DUMP. arm64 and loongarch already select
ARCH_KEEP_MEMBLOCK unconditionally.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Baoquan He <baoquan.he@linux.dev>
---
arch/riscv/Kconfig | 2 +-
arch/riscv/kernel/machine_kexec_file.c | 31 ++++++++++----------------
2 files changed, 13 insertions(+), 20 deletions(-)
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 62a4be0474e3..529310e3ae1e 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -58,7 +58,7 @@ config RISCV
select ARCH_HAS_UBSAN
select ARCH_HAS_VDSO_ARCH_DATA
select ARCH_HAVE_NMI_SAFE_CMPXCHG
- select ARCH_KEEP_MEMBLOCK if ACPI || KEXEC
+ select ARCH_KEEP_MEMBLOCK if ACPI || KEXEC || CRASH_DUMP
select ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE if 64BIT && MMU
select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX
select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT
diff --git a/arch/riscv/kernel/machine_kexec_file.c b/arch/riscv/kernel/machine_kexec_file.c
index 26cd2a8bd0cd..808e872f4063 100644
--- a/arch/riscv/kernel/machine_kexec_file.c
+++ b/arch/riscv/kernel/machine_kexec_file.c
@@ -37,39 +37,32 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)
}
#ifdef CONFIG_CRASH_DUMP
-static int get_nr_ram_ranges_callback(struct resource *res, void *arg)
-{
- unsigned int *nr_ranges = arg;
-
- (*nr_ranges)++;
- return 0;
-}
-
unsigned int arch_get_system_nr_ranges(void)
{
unsigned int nr_ranges = 2 + crashk_cma_cnt; /* For exclusion of crashkernel region */
+ u64 i;
+ phys_addr_t start, end;
- walk_system_ram_res(0, -1, &nr_ranges, get_nr_ram_ranges_callback);
+ for_each_mem_range(i, &start, &end)
+ nr_ranges++;
return nr_ranges;
}
-static int prepare_elf64_ram_headers_callback(struct resource *res, void *arg)
+int arch_crash_populate_cmem(struct crash_mem *cmem)
{
- struct crash_mem *cmem = arg;
+ u64 i;
+ phys_addr_t start, end;
- cmem->ranges[cmem->nr_ranges].start = res->start;
- cmem->ranges[cmem->nr_ranges].end = res->end;
- cmem->nr_ranges++;
+ for_each_mem_range(i, &start, &end) {
+ cmem->ranges[cmem->nr_ranges].start = start;
+ cmem->ranges[cmem->nr_ranges].end = end - 1;
+ cmem->nr_ranges++;
+ }
return 0;
}
-int arch_crash_populate_cmem(struct crash_mem *cmem)
-{
- return walk_system_ram_res(0, -1, cmem, prepare_elf64_ram_headers_callback);
-}
-
static char *setup_kdump_cmdline(struct kimage *image, char *cmdline,
unsigned long cmdline_len)
{
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [RESEND PATCH v8 1/8] riscv: build crash_mem ranges from memblock instead of resource tree
2026-10-16 6:15 ` Wandun Chen
(?)
@ 2026-10-16 6:28 ` sashiko-bot
-1 siblings, 0 replies; 26+ messages in thread
From: sashiko-bot @ 2026-10-16 6:28 UTC (permalink / raw)
To: Wandun Chen, robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, kexec
> From: Wandun Chen <chenwandun@lixiang.com>
>
> Replace walk_system_ram_res() with for_each_mem_range(). A later patch
> introduces MEMBLOCK_NODUMP in memblock, the reserved-memory regions
> marked with MEMBLOCK_NODUMP can be excluded from the vmcore by walking
> memblock.
>
> for_each_mem_range() iterates memblock.memory, which is freed after
> init unless ARCH_KEEP_MEMBLOCK is selected. riscv needs ARCH_KEEP_MEMBLOCK
> to filter reserved memory from the vmcore, so extend its condition
> (ACPI || KEXEC) with CRASH_DUMP. arm64 and loongarch already select
> ARCH_KEEP_MEMBLOCK unconditionally.
>
> Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016061549.4181390-1-chenwandun1@gmail.com?part=1
^ permalink raw reply [flat|nested] 26+ messages in thread
* [RESEND PATCH v8 2/8] crash_core: fold duplicated memblock arch hooks into the weak default
2026-10-16 6:15 ` Wandun Chen
@ 2026-10-16 6:15 ` Wandun Chen
-1 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
arm64, loongarch and riscv open-code the same memblock walk in
arch_get_system_nr_ranges() and arch_crash_populate_cmem(). Move it into
the __weak defaults in kernel/crash_core.c and delete the arch copies.
No functional change.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Baoquan He <baoquan.he@linux.dev>
---
arch/arm64/kernel/machine_kexec_file.c | 29 ----------------------
arch/loongarch/kernel/machine_kexec_file.c | 27 --------------------
arch/riscv/kernel/machine_kexec_file.c | 26 -------------------
kernel/crash_core.c | 27 ++++++++++++++++++++
4 files changed, 27 insertions(+), 82 deletions(-)
diff --git a/arch/arm64/kernel/machine_kexec_file.c b/arch/arm64/kernel/machine_kexec_file.c
index 854d872dfd0f..34d944d3f22f 100644
--- a/arch/arm64/kernel/machine_kexec_file.c
+++ b/arch/arm64/kernel/machine_kexec_file.c
@@ -14,7 +14,6 @@
#include <linux/kernel.h>
#include <linux/kexec.h>
#include <linux/libfdt.h>
-#include <linux/memblock.h>
#include <linux/of.h>
#include <linux/of_fdt.h>
#include <linux/slab.h>
@@ -39,34 +38,6 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)
return kexec_image_post_load_cleanup_default(image);
}
-#ifdef CONFIG_CRASH_DUMP
-unsigned int arch_get_system_nr_ranges(void)
-{
- unsigned int nr_ranges = 2 + crashk_cma_cnt; /* for exclusion of crashkernel region */
- phys_addr_t start, end;
- u64 i;
-
- for_each_mem_range(i, &start, &end)
- nr_ranges++;
-
- return nr_ranges;
-}
-
-int arch_crash_populate_cmem(struct crash_mem *cmem)
-{
- phys_addr_t start, end;
- u64 i;
-
- for_each_mem_range(i, &start, &end) {
- cmem->ranges[cmem->nr_ranges].start = start;
- cmem->ranges[cmem->nr_ranges].end = end - 1;
- cmem->nr_ranges++;
- }
-
- return 0;
-}
-#endif
-
/*
* Tries to add the initrd and DTB to the image. If it is not possible to find
* valid locations, this function will undo changes to the image and return non
diff --git a/arch/loongarch/kernel/machine_kexec_file.c b/arch/loongarch/kernel/machine_kexec_file.c
index 5412aa9f3568..481b8f906a56 100644
--- a/arch/loongarch/kernel/machine_kexec_file.c
+++ b/arch/loongarch/kernel/machine_kexec_file.c
@@ -13,7 +13,6 @@
#include <linux/ioport.h>
#include <linux/kernel.h>
#include <linux/kexec.h>
-#include <linux/memblock.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/types.h>
@@ -56,32 +55,6 @@ static void cmdline_add_initrd(struct kimage *image, unsigned long *cmdline_tmpl
}
#ifdef CONFIG_CRASH_DUMP
-unsigned int arch_get_system_nr_ranges(void)
-{
- int nr_ranges = 2; /* for exclusion of crashkernel region */
- phys_addr_t start, end;
- uint64_t i;
-
- for_each_mem_range(i, &start, &end)
- nr_ranges++;
-
- return nr_ranges;
-}
-
-int arch_crash_populate_cmem(struct crash_mem *cmem)
-{
- phys_addr_t start, end;
- uint64_t i;
-
- for_each_mem_range(i, &start, &end) {
- cmem->ranges[cmem->nr_ranges].start = start;
- cmem->ranges[cmem->nr_ranges].end = end - 1;
- cmem->nr_ranges++;
- }
-
- return 0;
-}
-
/*
* Add the "mem=size@start" command line parameter to command line, indicating the
* memory region the new kernel can use to boot into.
diff --git a/arch/riscv/kernel/machine_kexec_file.c b/arch/riscv/kernel/machine_kexec_file.c
index 808e872f4063..fdc6695e8588 100644
--- a/arch/riscv/kernel/machine_kexec_file.c
+++ b/arch/riscv/kernel/machine_kexec_file.c
@@ -37,32 +37,6 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)
}
#ifdef CONFIG_CRASH_DUMP
-unsigned int arch_get_system_nr_ranges(void)
-{
- unsigned int nr_ranges = 2 + crashk_cma_cnt; /* For exclusion of crashkernel region */
- u64 i;
- phys_addr_t start, end;
-
- for_each_mem_range(i, &start, &end)
- nr_ranges++;
-
- return nr_ranges;
-}
-
-int arch_crash_populate_cmem(struct crash_mem *cmem)
-{
- u64 i;
- phys_addr_t start, end;
-
- for_each_mem_range(i, &start, &end) {
- cmem->ranges[cmem->nr_ranges].start = start;
- cmem->ranges[cmem->nr_ranges].end = end - 1;
- cmem->nr_ranges++;
- }
-
- return 0;
-}
-
static char *setup_kdump_cmdline(struct kimage *image, char *cmdline,
unsigned long cmdline_len)
{
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
index d0bd2d0cf899..faa0f22dbb41 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -281,8 +281,35 @@ static struct crash_mem *alloc_cmem(unsigned int nr_ranges)
return cmem;
}
+#ifdef CONFIG_ARCH_KEEP_MEMBLOCK
+unsigned int __weak arch_get_system_nr_ranges(void)
+{
+ unsigned int nr_ranges = 2 + crashk_cma_cnt; /* crashk_res + crashk_low_res, +CMA splits */
+ phys_addr_t start, end;
+ u64 i;
+
+ for_each_mem_range(i, &start, &end)
+ nr_ranges++;
+ return nr_ranges;
+}
+
+int __weak arch_crash_populate_cmem(struct crash_mem *cmem)
+{
+ phys_addr_t start, end;
+ u64 i;
+
+ for_each_mem_range(i, &start, &end) {
+ cmem->ranges[cmem->nr_ranges].start = start;
+ cmem->ranges[cmem->nr_ranges].end = end - 1;
+ cmem->nr_ranges++;
+ }
+ return 0;
+}
+#else
unsigned int __weak arch_get_system_nr_ranges(void) { return 0; }
int __weak arch_crash_populate_cmem(struct crash_mem *cmem) { return -1; }
+#endif
+
int __weak arch_crash_exclude_ranges(struct crash_mem *cmem) { return 0; }
int __weak arch_crash_exclude_mem_range(struct crash_mem **mem,
--
2.43.0
^ permalink raw reply related [flat|nested] 26+ messages in thread* [RESEND PATCH v8 2/8] crash_core: fold duplicated memblock arch hooks into the weak default
@ 2026-10-16 6:15 ` Wandun Chen
0 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
arm64, loongarch and riscv open-code the same memblock walk in
arch_get_system_nr_ranges() and arch_crash_populate_cmem(). Move it into
the __weak defaults in kernel/crash_core.c and delete the arch copies.
No functional change.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Baoquan He <baoquan.he@linux.dev>
---
arch/arm64/kernel/machine_kexec_file.c | 29 ----------------------
arch/loongarch/kernel/machine_kexec_file.c | 27 --------------------
arch/riscv/kernel/machine_kexec_file.c | 26 -------------------
kernel/crash_core.c | 27 ++++++++++++++++++++
4 files changed, 27 insertions(+), 82 deletions(-)
diff --git a/arch/arm64/kernel/machine_kexec_file.c b/arch/arm64/kernel/machine_kexec_file.c
index 854d872dfd0f..34d944d3f22f 100644
--- a/arch/arm64/kernel/machine_kexec_file.c
+++ b/arch/arm64/kernel/machine_kexec_file.c
@@ -14,7 +14,6 @@
#include <linux/kernel.h>
#include <linux/kexec.h>
#include <linux/libfdt.h>
-#include <linux/memblock.h>
#include <linux/of.h>
#include <linux/of_fdt.h>
#include <linux/slab.h>
@@ -39,34 +38,6 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)
return kexec_image_post_load_cleanup_default(image);
}
-#ifdef CONFIG_CRASH_DUMP
-unsigned int arch_get_system_nr_ranges(void)
-{
- unsigned int nr_ranges = 2 + crashk_cma_cnt; /* for exclusion of crashkernel region */
- phys_addr_t start, end;
- u64 i;
-
- for_each_mem_range(i, &start, &end)
- nr_ranges++;
-
- return nr_ranges;
-}
-
-int arch_crash_populate_cmem(struct crash_mem *cmem)
-{
- phys_addr_t start, end;
- u64 i;
-
- for_each_mem_range(i, &start, &end) {
- cmem->ranges[cmem->nr_ranges].start = start;
- cmem->ranges[cmem->nr_ranges].end = end - 1;
- cmem->nr_ranges++;
- }
-
- return 0;
-}
-#endif
-
/*
* Tries to add the initrd and DTB to the image. If it is not possible to find
* valid locations, this function will undo changes to the image and return non
diff --git a/arch/loongarch/kernel/machine_kexec_file.c b/arch/loongarch/kernel/machine_kexec_file.c
index 5412aa9f3568..481b8f906a56 100644
--- a/arch/loongarch/kernel/machine_kexec_file.c
+++ b/arch/loongarch/kernel/machine_kexec_file.c
@@ -13,7 +13,6 @@
#include <linux/ioport.h>
#include <linux/kernel.h>
#include <linux/kexec.h>
-#include <linux/memblock.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/types.h>
@@ -56,32 +55,6 @@ static void cmdline_add_initrd(struct kimage *image, unsigned long *cmdline_tmpl
}
#ifdef CONFIG_CRASH_DUMP
-unsigned int arch_get_system_nr_ranges(void)
-{
- int nr_ranges = 2; /* for exclusion of crashkernel region */
- phys_addr_t start, end;
- uint64_t i;
-
- for_each_mem_range(i, &start, &end)
- nr_ranges++;
-
- return nr_ranges;
-}
-
-int arch_crash_populate_cmem(struct crash_mem *cmem)
-{
- phys_addr_t start, end;
- uint64_t i;
-
- for_each_mem_range(i, &start, &end) {
- cmem->ranges[cmem->nr_ranges].start = start;
- cmem->ranges[cmem->nr_ranges].end = end - 1;
- cmem->nr_ranges++;
- }
-
- return 0;
-}
-
/*
* Add the "mem=size@start" command line parameter to command line, indicating the
* memory region the new kernel can use to boot into.
diff --git a/arch/riscv/kernel/machine_kexec_file.c b/arch/riscv/kernel/machine_kexec_file.c
index 808e872f4063..fdc6695e8588 100644
--- a/arch/riscv/kernel/machine_kexec_file.c
+++ b/arch/riscv/kernel/machine_kexec_file.c
@@ -37,32 +37,6 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)
}
#ifdef CONFIG_CRASH_DUMP
-unsigned int arch_get_system_nr_ranges(void)
-{
- unsigned int nr_ranges = 2 + crashk_cma_cnt; /* For exclusion of crashkernel region */
- u64 i;
- phys_addr_t start, end;
-
- for_each_mem_range(i, &start, &end)
- nr_ranges++;
-
- return nr_ranges;
-}
-
-int arch_crash_populate_cmem(struct crash_mem *cmem)
-{
- u64 i;
- phys_addr_t start, end;
-
- for_each_mem_range(i, &start, &end) {
- cmem->ranges[cmem->nr_ranges].start = start;
- cmem->ranges[cmem->nr_ranges].end = end - 1;
- cmem->nr_ranges++;
- }
-
- return 0;
-}
-
static char *setup_kdump_cmdline(struct kimage *image, char *cmdline,
unsigned long cmdline_len)
{
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
index d0bd2d0cf899..faa0f22dbb41 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -281,8 +281,35 @@ static struct crash_mem *alloc_cmem(unsigned int nr_ranges)
return cmem;
}
+#ifdef CONFIG_ARCH_KEEP_MEMBLOCK
+unsigned int __weak arch_get_system_nr_ranges(void)
+{
+ unsigned int nr_ranges = 2 + crashk_cma_cnt; /* crashk_res + crashk_low_res, +CMA splits */
+ phys_addr_t start, end;
+ u64 i;
+
+ for_each_mem_range(i, &start, &end)
+ nr_ranges++;
+ return nr_ranges;
+}
+
+int __weak arch_crash_populate_cmem(struct crash_mem *cmem)
+{
+ phys_addr_t start, end;
+ u64 i;
+
+ for_each_mem_range(i, &start, &end) {
+ cmem->ranges[cmem->nr_ranges].start = start;
+ cmem->ranges[cmem->nr_ranges].end = end - 1;
+ cmem->nr_ranges++;
+ }
+ return 0;
+}
+#else
unsigned int __weak arch_get_system_nr_ranges(void) { return 0; }
int __weak arch_crash_populate_cmem(struct crash_mem *cmem) { return -1; }
+#endif
+
int __weak arch_crash_exclude_ranges(struct crash_mem *cmem) { return 0; }
int __weak arch_crash_exclude_mem_range(struct crash_mem **mem,
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [RESEND PATCH v8 2/8] crash_core: fold duplicated memblock arch hooks into the weak default
2026-10-16 6:15 ` Wandun Chen
(?)
@ 2026-10-16 6:30 ` sashiko-bot
-1 siblings, 0 replies; 26+ messages in thread
From: sashiko-bot @ 2026-10-16 6:30 UTC (permalink / raw)
To: Wandun Chen, robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, kexec
> From: Wandun Chen <chenwandun@lixiang.com>
>
> arm64, loongarch and riscv open-code the same memblock walk in
> arch_get_system_nr_ranges() and arch_crash_populate_cmem(). Move it into
> the __weak defaults in kernel/crash_core.c and delete the arch copies.
>
> No functional change.
>
> Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016061549.4181390-1-chenwandun1@gmail.com?part=2
^ permalink raw reply [flat|nested] 26+ messages in thread
* [RESEND PATCH v8 3/8] crash_core: serialize crash header preparation against hotplug
2026-10-16 6:15 ` Wandun Chen
@ 2026-10-16 6:15 ` Wandun Chen
-1 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
crash_prepare_headers() counts memory ranges before populating the
allocated crash_mem array. The weak implementation used by ARM64,
RISC-V and LoongArch walks memblock.memory, while x86 performs the same
two-pass operation over system RAM resources. Concurrent memory hotplug
can change range source between the two walks and make the populate
pass overflow cmem->ranges.
Take device_hotplug_lock when preparing crash headers during
kexec_file_load(). The x86/riscv memory hotplug path already takes
device_hotplug_lock, so call __crash_prepare_headers() directly
to avoid recursive locking.
Sashiko reported this issue in [1].
Fixes: 3751e728cef2 ("arm64: kexec_file: add crash dump support")
Fixes: 1bcca8620a91 ("LoongArch: Add crash dump support for kexec_file")
Fixes: 8acea455fafa ("RISC-V: Support for kexec_file on panic")
Fixes: dd5f726076cc ("kexec: support for kexec on panic using new system call")
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Link: https://sashiko.dev/#/message/20260806101002.1F84E1F000E9@smtp.kernel.org [1]
Acked-by: Baoquan He <baoquan.he@linux.dev>
---
arch/riscv/kernel/crash.c | 2 +-
arch/x86/kernel/crash.c | 2 +-
include/linux/crash_core.h | 2 ++
kernel/crash_core.c | 17 +++++++++++++++--
4 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/arch/riscv/kernel/crash.c b/arch/riscv/kernel/crash.c
index fe5a4b306aae..ac8df2edf2a7 100644
--- a/arch/riscv/kernel/crash.c
+++ b/arch/riscv/kernel/crash.c
@@ -70,7 +70,7 @@ void arch_crash_handle_hotplug_event(struct kimage *image, void *arg)
* Create the new elfcorehdr reflecting the changes to CPU and/or
* memory resources.
*/
- if (crash_prepare_headers(true, &elfbuf, &elfsz, NULL)) {
+ if (__crash_prepare_headers(true, &elfbuf, &elfsz, NULL)) {
pr_err("unable to create new elfcorehdr");
goto out;
}
diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c
index e6f23933a6df..bef008a0cb22 100644
--- a/arch/x86/kernel/crash.c
+++ b/arch/x86/kernel/crash.c
@@ -465,7 +465,7 @@ void arch_crash_handle_hotplug_event(struct kimage *image, void *arg)
* Create the new elfcorehdr reflecting the changes to CPU and/or
* memory resources.
*/
- if (crash_prepare_headers(IS_ENABLED(CONFIG_X86_64), &elfbuf, &elfsz, NULL)) {
+ if (__crash_prepare_headers(IS_ENABLED(CONFIG_X86_64), &elfbuf, &elfsz, NULL)) {
pr_err("unable to create new elfcorehdr");
goto out;
}
diff --git a/include/linux/crash_core.h b/include/linux/crash_core.h
index bc087124cd78..28e7a81cf263 100644
--- a/include/linux/crash_core.h
+++ b/include/linux/crash_core.h
@@ -61,6 +61,8 @@ extern int crash_prepare_elf64_headers(struct crash_mem *mem, int need_kernel_ma
void **addr, unsigned long *sz);
extern int crash_prepare_headers(int need_kernel_map, void **addr,
unsigned long *sz, unsigned long *nr_mem_ranges);
+int __crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
+ unsigned long *nr_mem_ranges);
extern int crash_exclude_core_ranges(struct crash_mem **cmem);
struct kimage;
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
index faa0f22dbb41..8a861a946e26 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -16,6 +16,7 @@
#include <linux/mm.h>
#include <linux/cpuhotplug.h>
#include <linux/memblock.h>
+#include <linux/device.h>
#include <linux/kmemleak.h>
#include <linux/crash_core.h>
#include <linux/reboot.h>
@@ -344,8 +345,8 @@ int crash_exclude_core_ranges(struct crash_mem **cmem)
return 0;
}
-int crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
- unsigned long *nr_mem_ranges)
+int __crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
+ unsigned long *nr_mem_ranges)
{
unsigned int max_nr_ranges;
struct crash_mem *cmem;
@@ -382,6 +383,18 @@ int crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
return ret;
}
+int crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
+ unsigned long *nr_mem_ranges)
+{
+ int ret;
+
+ lock_device_hotplug();
+ ret = __crash_prepare_headers(need_kernel_map, addr, sz, nr_mem_ranges);
+ unlock_device_hotplug();
+
+ return ret;
+}
+
/**
* crash_exclude_mem_range - exclude a mem range for existing ranges
* @mem: mem->range contains an array of ranges sorted in ascending order
--
2.43.0
^ permalink raw reply related [flat|nested] 26+ messages in thread* [RESEND PATCH v8 3/8] crash_core: serialize crash header preparation against hotplug
@ 2026-10-16 6:15 ` Wandun Chen
0 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
crash_prepare_headers() counts memory ranges before populating the
allocated crash_mem array. The weak implementation used by ARM64,
RISC-V and LoongArch walks memblock.memory, while x86 performs the same
two-pass operation over system RAM resources. Concurrent memory hotplug
can change range source between the two walks and make the populate
pass overflow cmem->ranges.
Take device_hotplug_lock when preparing crash headers during
kexec_file_load(). The x86/riscv memory hotplug path already takes
device_hotplug_lock, so call __crash_prepare_headers() directly
to avoid recursive locking.
Sashiko reported this issue in [1].
Fixes: 3751e728cef2 ("arm64: kexec_file: add crash dump support")
Fixes: 1bcca8620a91 ("LoongArch: Add crash dump support for kexec_file")
Fixes: 8acea455fafa ("RISC-V: Support for kexec_file on panic")
Fixes: dd5f726076cc ("kexec: support for kexec on panic using new system call")
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Link: https://sashiko.dev/#/message/20260806101002.1F84E1F000E9@smtp.kernel.org [1]
Acked-by: Baoquan He <baoquan.he@linux.dev>
---
arch/riscv/kernel/crash.c | 2 +-
arch/x86/kernel/crash.c | 2 +-
include/linux/crash_core.h | 2 ++
kernel/crash_core.c | 17 +++++++++++++++--
4 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/arch/riscv/kernel/crash.c b/arch/riscv/kernel/crash.c
index fe5a4b306aae..ac8df2edf2a7 100644
--- a/arch/riscv/kernel/crash.c
+++ b/arch/riscv/kernel/crash.c
@@ -70,7 +70,7 @@ void arch_crash_handle_hotplug_event(struct kimage *image, void *arg)
* Create the new elfcorehdr reflecting the changes to CPU and/or
* memory resources.
*/
- if (crash_prepare_headers(true, &elfbuf, &elfsz, NULL)) {
+ if (__crash_prepare_headers(true, &elfbuf, &elfsz, NULL)) {
pr_err("unable to create new elfcorehdr");
goto out;
}
diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c
index e6f23933a6df..bef008a0cb22 100644
--- a/arch/x86/kernel/crash.c
+++ b/arch/x86/kernel/crash.c
@@ -465,7 +465,7 @@ void arch_crash_handle_hotplug_event(struct kimage *image, void *arg)
* Create the new elfcorehdr reflecting the changes to CPU and/or
* memory resources.
*/
- if (crash_prepare_headers(IS_ENABLED(CONFIG_X86_64), &elfbuf, &elfsz, NULL)) {
+ if (__crash_prepare_headers(IS_ENABLED(CONFIG_X86_64), &elfbuf, &elfsz, NULL)) {
pr_err("unable to create new elfcorehdr");
goto out;
}
diff --git a/include/linux/crash_core.h b/include/linux/crash_core.h
index bc087124cd78..28e7a81cf263 100644
--- a/include/linux/crash_core.h
+++ b/include/linux/crash_core.h
@@ -61,6 +61,8 @@ extern int crash_prepare_elf64_headers(struct crash_mem *mem, int need_kernel_ma
void **addr, unsigned long *sz);
extern int crash_prepare_headers(int need_kernel_map, void **addr,
unsigned long *sz, unsigned long *nr_mem_ranges);
+int __crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
+ unsigned long *nr_mem_ranges);
extern int crash_exclude_core_ranges(struct crash_mem **cmem);
struct kimage;
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
index faa0f22dbb41..8a861a946e26 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -16,6 +16,7 @@
#include <linux/mm.h>
#include <linux/cpuhotplug.h>
#include <linux/memblock.h>
+#include <linux/device.h>
#include <linux/kmemleak.h>
#include <linux/crash_core.h>
#include <linux/reboot.h>
@@ -344,8 +345,8 @@ int crash_exclude_core_ranges(struct crash_mem **cmem)
return 0;
}
-int crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
- unsigned long *nr_mem_ranges)
+int __crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
+ unsigned long *nr_mem_ranges)
{
unsigned int max_nr_ranges;
struct crash_mem *cmem;
@@ -382,6 +383,18 @@ int crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
return ret;
}
+int crash_prepare_headers(int need_kernel_map, void **addr, unsigned long *sz,
+ unsigned long *nr_mem_ranges)
+{
+ int ret;
+
+ lock_device_hotplug();
+ ret = __crash_prepare_headers(need_kernel_map, addr, sz, nr_mem_ranges);
+ unlock_device_hotplug();
+
+ return ret;
+}
+
/**
* crash_exclude_mem_range - exclude a mem range for existing ranges
* @mem: mem->range contains an array of ranges sorted in ascending order
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [RESEND PATCH v8 3/8] crash_core: serialize crash header preparation against hotplug
2026-10-16 6:15 ` Wandun Chen
(?)
@ 2026-10-16 6:33 ` sashiko-bot
-1 siblings, 0 replies; 26+ messages in thread
From: sashiko-bot @ 2026-10-16 6:33 UTC (permalink / raw)
To: Wandun Chen, robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, kexec
> From: Wandun Chen <chenwandun@lixiang.com>
>
> crash_prepare_headers() counts memory ranges before populating the
> allocated crash_mem array. The weak implementation used by ARM64,
> RISC-V and LoongArch walks memblock.memory, while x86 performs the same
> two-pass operation over system RAM resources. Concurrent memory hotplug
> can change range source between the two walks and make the populate
> pass overflow cmem->ranges.
>
> Take device_hotplug_lock when preparing crash headers during
> kexec_file_load(). The x86/riscv memory hotplug path already takes
> device_hotplug_lock, so call __crash_prepare_headers() directly
> to avoid recursive locking.
>
> Sashiko reported this issue in [1].
>
> Fixes: 3751e728cef2 ("arm64: kexec_file: add crash dump support")
> Fixes: 1bcca8620a91 ("LoongArch: Add crash dump support for kexec_file")
> Fixes: 8acea455fafa ("RISC-V: Support for kexec_file on panic")
> Fixes: dd5f726076cc ("kexec: support for kexec on panic using new system call")
> Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016061549.4181390-1-chenwandun1@gmail.com?part=3
^ permalink raw reply [flat|nested] 26+ messages in thread
* [RESEND PATCH v8 4/8] crash_core: replace for_each_mem_range() with for_each_mem_region()
2026-10-16 6:15 ` Wandun Chen
@ 2026-10-16 6:15 ` Wandun Chen
-1 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
for_each_mem_range() skips MEMBLOCK_NOMAP regions implicitly. Switch the
weak defaults to for_each_mem_region(), which exposes struct
memblock_region and per-region flags, and filter NOMAP regions explicitly
via the new crash_should_skip_region() helper. This prepares for a
subsequent patch to extend the skip filter.
No functional change.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Baoquan He <baoquan.he@linux.dev>
---
kernel/crash_core.c | 25 +++++++++++++++++--------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
index 8a861a946e26..e161c8b65e00 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -283,25 +283,34 @@ static struct crash_mem *alloc_cmem(unsigned int nr_ranges)
}
#ifdef CONFIG_ARCH_KEEP_MEMBLOCK
+/* Exclude NOMAP regions from the vmcore. */
+static bool crash_should_skip_region(struct memblock_region *reg)
+{
+ return memblock_is_nomap(reg);
+}
+
unsigned int __weak arch_get_system_nr_ranges(void)
{
unsigned int nr_ranges = 2 + crashk_cma_cnt; /* crashk_res + crashk_low_res, +CMA splits */
- phys_addr_t start, end;
- u64 i;
+ struct memblock_region *reg;
- for_each_mem_range(i, &start, &end)
+ for_each_mem_region(reg) {
+ if (crash_should_skip_region(reg))
+ continue;
nr_ranges++;
+ }
return nr_ranges;
}
int __weak arch_crash_populate_cmem(struct crash_mem *cmem)
{
- phys_addr_t start, end;
- u64 i;
+ struct memblock_region *reg;
- for_each_mem_range(i, &start, &end) {
- cmem->ranges[cmem->nr_ranges].start = start;
- cmem->ranges[cmem->nr_ranges].end = end - 1;
+ for_each_mem_region(reg) {
+ if (crash_should_skip_region(reg))
+ continue;
+ cmem->ranges[cmem->nr_ranges].start = reg->base;
+ cmem->ranges[cmem->nr_ranges].end = reg->base + reg->size - 1;
cmem->nr_ranges++;
}
return 0;
--
2.43.0
^ permalink raw reply related [flat|nested] 26+ messages in thread* [RESEND PATCH v8 4/8] crash_core: replace for_each_mem_range() with for_each_mem_region()
@ 2026-10-16 6:15 ` Wandun Chen
0 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
for_each_mem_range() skips MEMBLOCK_NOMAP regions implicitly. Switch the
weak defaults to for_each_mem_region(), which exposes struct
memblock_region and per-region flags, and filter NOMAP regions explicitly
via the new crash_should_skip_region() helper. This prepares for a
subsequent patch to extend the skip filter.
No functional change.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Baoquan He <baoquan.he@linux.dev>
---
kernel/crash_core.c | 25 +++++++++++++++++--------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
index 8a861a946e26..e161c8b65e00 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -283,25 +283,34 @@ static struct crash_mem *alloc_cmem(unsigned int nr_ranges)
}
#ifdef CONFIG_ARCH_KEEP_MEMBLOCK
+/* Exclude NOMAP regions from the vmcore. */
+static bool crash_should_skip_region(struct memblock_region *reg)
+{
+ return memblock_is_nomap(reg);
+}
+
unsigned int __weak arch_get_system_nr_ranges(void)
{
unsigned int nr_ranges = 2 + crashk_cma_cnt; /* crashk_res + crashk_low_res, +CMA splits */
- phys_addr_t start, end;
- u64 i;
+ struct memblock_region *reg;
- for_each_mem_range(i, &start, &end)
+ for_each_mem_region(reg) {
+ if (crash_should_skip_region(reg))
+ continue;
nr_ranges++;
+ }
return nr_ranges;
}
int __weak arch_crash_populate_cmem(struct crash_mem *cmem)
{
- phys_addr_t start, end;
- u64 i;
+ struct memblock_region *reg;
- for_each_mem_range(i, &start, &end) {
- cmem->ranges[cmem->nr_ranges].start = start;
- cmem->ranges[cmem->nr_ranges].end = end - 1;
+ for_each_mem_region(reg) {
+ if (crash_should_skip_region(reg))
+ continue;
+ cmem->ranges[cmem->nr_ranges].start = reg->base;
+ cmem->ranges[cmem->nr_ranges].end = reg->base + reg->size - 1;
cmem->nr_ranges++;
}
return 0;
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [RESEND PATCH v8 4/8] crash_core: replace for_each_mem_range() with for_each_mem_region()
2026-10-16 6:15 ` Wandun Chen
(?)
@ 2026-10-16 6:29 ` sashiko-bot
-1 siblings, 0 replies; 26+ messages in thread
From: sashiko-bot @ 2026-10-16 6:29 UTC (permalink / raw)
To: Wandun Chen, robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, kexec
> From: Wandun Chen <chenwandun@lixiang.com>
>
> for_each_mem_range() skips MEMBLOCK_NOMAP regions implicitly. Switch the
> weak defaults to for_each_mem_region(), which exposes struct
> memblock_region and per-region flags, and filter NOMAP regions explicitly
> via the new crash_should_skip_region() helper. This prepares for a
> subsequent patch to extend the skip filter.
>
> No functional change.
>
> Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016061549.4181390-1-chenwandun1@gmail.com?part=4
^ permalink raw reply [flat|nested] 26+ messages in thread
* [RESEND PATCH v8 5/8] memblock: introduce MEMBLOCK_NODUMP flag
2026-10-16 6:15 ` Wandun Chen
@ 2026-10-16 6:15 ` Wandun Chen
-1 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
Add MEMBLOCK_NODUMP to mark regions that should be excluded from
kdump vmcores.
The flag is meant for reserved memory that carries no data useful for
crash analysis. Reusable reserved regions such as CMA may hold useful
data, so these regions must not be marked MEMBLOCK_NODUMP. Subsequent
patches wire this up for /reserved-memory entries.
Suggested-by: Rob Herring <robh@kernel.org>
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
---
include/linux/memblock.h | 9 +++++++++
mm/memblock.c | 16 ++++++++++++++++
2 files changed, 25 insertions(+)
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index ea288cf21400..04fbdff2b808 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -52,6 +52,8 @@ extern unsigned long long max_possible_pfn;
* know is good to use. It is the only memory that allocations may happen from
* in this phase.
* @MEMBLOCK_RSRV_HUGETLB: memory is reserved for hugetlb pages
+ * @MEMBLOCK_NODUMP: exclude from kdump vmcore. It carries no data useful
+ * for crash analysis (e.g. firmware carveouts).
*/
enum memblock_flags {
MEMBLOCK_NONE = 0x0, /* No special request */
@@ -63,6 +65,7 @@ enum memblock_flags {
MEMBLOCK_RSRV_KERN = 0x20, /* memory reserved for kernel use */
MEMBLOCK_KHO_NOPRSRV = 0x40, /* memory with no KHO preservations */
MEMBLOCK_RSRV_HUGETLB = 0x80, /* memory reserved for hugetlb pages */
+ MEMBLOCK_NODUMP = 0x100,/* exclude from kdump vmcore */
};
/**
@@ -160,6 +163,7 @@ int memblock_reserved_mark_noinit(phys_addr_t base, phys_addr_t size);
int memblock_reserved_mark_kern(phys_addr_t base, phys_addr_t size);
int memblock_mark_kho_noprsrv(phys_addr_t base, phys_addr_t size);
int memblock_clear_kho_noprsrv(phys_addr_t base, phys_addr_t size);
+int memblock_mark_nodump(phys_addr_t base, phys_addr_t size);
void memblock_free(void *ptr, size_t size);
@@ -305,6 +309,11 @@ static inline bool memblock_is_kho_noprsrv(struct memblock_region *m)
return m->flags & MEMBLOCK_KHO_NOPRSRV;
}
+static inline bool memblock_is_nodump(struct memblock_region *m)
+{
+ return m->flags & MEMBLOCK_NODUMP;
+}
+
int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn,
unsigned long *end_pfn);
void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn,
diff --git a/mm/memblock.c b/mm/memblock.c
index cbb172fbf06a..31c89bd64036 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -1204,6 +1204,21 @@ __init int memblock_clear_kho_noprsrv(phys_addr_t base, phys_addr_t size)
MEMBLOCK_KHO_NOPRSRV);
}
+/**
+ * memblock_mark_nodump - Mark a memory region with flag MEMBLOCK_NODUMP.
+ * @base: the base phys addr of the region
+ * @size: the size of the region
+ *
+ * Mark the region as not to be included in crash dumps.
+ *
+ * Return: 0 on success, -errno on failure.
+ */
+int __init_memblock memblock_mark_nodump(phys_addr_t base, phys_addr_t size)
+{
+ return memblock_setclr_flag(&memblock.memory, base, size, 1,
+ MEMBLOCK_NODUMP);
+}
+
static bool should_skip_region(struct memblock_type *type,
struct memblock_region *m,
int nid, int flags)
@@ -2880,6 +2895,7 @@ static const char * const flagname[] = {
[ilog2(MEMBLOCK_RSRV_KERN)] = "RSV_KERN",
[ilog2(MEMBLOCK_KHO_NOPRSRV)] = "KHO_NOPRSRV",
[ilog2(MEMBLOCK_RSRV_HUGETLB)] = "RSV_HUGETLB",
+ [ilog2(MEMBLOCK_NODUMP)] = "NODUMP",
};
static int memblock_debug_show(struct seq_file *m, void *private)
--
2.43.0
^ permalink raw reply related [flat|nested] 26+ messages in thread* [RESEND PATCH v8 5/8] memblock: introduce MEMBLOCK_NODUMP flag
@ 2026-10-16 6:15 ` Wandun Chen
0 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
Add MEMBLOCK_NODUMP to mark regions that should be excluded from
kdump vmcores.
The flag is meant for reserved memory that carries no data useful for
crash analysis. Reusable reserved regions such as CMA may hold useful
data, so these regions must not be marked MEMBLOCK_NODUMP. Subsequent
patches wire this up for /reserved-memory entries.
Suggested-by: Rob Herring <robh@kernel.org>
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
---
include/linux/memblock.h | 9 +++++++++
mm/memblock.c | 16 ++++++++++++++++
2 files changed, 25 insertions(+)
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index ea288cf21400..04fbdff2b808 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -52,6 +52,8 @@ extern unsigned long long max_possible_pfn;
* know is good to use. It is the only memory that allocations may happen from
* in this phase.
* @MEMBLOCK_RSRV_HUGETLB: memory is reserved for hugetlb pages
+ * @MEMBLOCK_NODUMP: exclude from kdump vmcore. It carries no data useful
+ * for crash analysis (e.g. firmware carveouts).
*/
enum memblock_flags {
MEMBLOCK_NONE = 0x0, /* No special request */
@@ -63,6 +65,7 @@ enum memblock_flags {
MEMBLOCK_RSRV_KERN = 0x20, /* memory reserved for kernel use */
MEMBLOCK_KHO_NOPRSRV = 0x40, /* memory with no KHO preservations */
MEMBLOCK_RSRV_HUGETLB = 0x80, /* memory reserved for hugetlb pages */
+ MEMBLOCK_NODUMP = 0x100,/* exclude from kdump vmcore */
};
/**
@@ -160,6 +163,7 @@ int memblock_reserved_mark_noinit(phys_addr_t base, phys_addr_t size);
int memblock_reserved_mark_kern(phys_addr_t base, phys_addr_t size);
int memblock_mark_kho_noprsrv(phys_addr_t base, phys_addr_t size);
int memblock_clear_kho_noprsrv(phys_addr_t base, phys_addr_t size);
+int memblock_mark_nodump(phys_addr_t base, phys_addr_t size);
void memblock_free(void *ptr, size_t size);
@@ -305,6 +309,11 @@ static inline bool memblock_is_kho_noprsrv(struct memblock_region *m)
return m->flags & MEMBLOCK_KHO_NOPRSRV;
}
+static inline bool memblock_is_nodump(struct memblock_region *m)
+{
+ return m->flags & MEMBLOCK_NODUMP;
+}
+
int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn,
unsigned long *end_pfn);
void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn,
diff --git a/mm/memblock.c b/mm/memblock.c
index cbb172fbf06a..31c89bd64036 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -1204,6 +1204,21 @@ __init int memblock_clear_kho_noprsrv(phys_addr_t base, phys_addr_t size)
MEMBLOCK_KHO_NOPRSRV);
}
+/**
+ * memblock_mark_nodump - Mark a memory region with flag MEMBLOCK_NODUMP.
+ * @base: the base phys addr of the region
+ * @size: the size of the region
+ *
+ * Mark the region as not to be included in crash dumps.
+ *
+ * Return: 0 on success, -errno on failure.
+ */
+int __init_memblock memblock_mark_nodump(phys_addr_t base, phys_addr_t size)
+{
+ return memblock_setclr_flag(&memblock.memory, base, size, 1,
+ MEMBLOCK_NODUMP);
+}
+
static bool should_skip_region(struct memblock_type *type,
struct memblock_region *m,
int nid, int flags)
@@ -2880,6 +2895,7 @@ static const char * const flagname[] = {
[ilog2(MEMBLOCK_RSRV_KERN)] = "RSV_KERN",
[ilog2(MEMBLOCK_KHO_NOPRSRV)] = "KHO_NOPRSRV",
[ilog2(MEMBLOCK_RSRV_HUGETLB)] = "RSV_HUGETLB",
+ [ilog2(MEMBLOCK_NODUMP)] = "NODUMP",
};
static int memblock_debug_show(struct seq_file *m, void *private)
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [RESEND PATCH v8 5/8] memblock: introduce MEMBLOCK_NODUMP flag
2026-10-16 6:15 ` Wandun Chen
(?)
@ 2026-10-16 6:26 ` sashiko-bot
-1 siblings, 0 replies; 26+ messages in thread
From: sashiko-bot @ 2026-10-16 6:26 UTC (permalink / raw)
To: Wandun Chen, robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, kexec
> From: Wandun Chen <chenwandun@lixiang.com>
>
> Add MEMBLOCK_NODUMP to mark regions that should be excluded from
> kdump vmcores.
>
> The flag is meant for reserved memory that carries no data useful for
> crash analysis. Reusable reserved regions such as CMA may hold useful
> data, so these regions must not be marked MEMBLOCK_NODUMP. Subsequent
> patches wire this up for /reserved-memory entries.
>
> Suggested-by: Rob Herring <robh@kernel.org>
> Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016061549.4181390-1-chenwandun1@gmail.com?part=5
^ permalink raw reply [flat|nested] 26+ messages in thread
* [RESEND PATCH v8 6/8] of: reserved_mem: add dumpable flag to opt-in vmcore
2026-10-16 6:15 ` Wandun Chen
@ 2026-10-16 6:15 ` Wandun Chen
-1 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
Add a 'dumpable' flag to struct reserved_mem to decide whether a
reserved area should be included in the kdump vmcore. Non-dumpable
regions are later marked MEMBLOCK_NODUMP; the filtering itself happens
in memblock, keeping the arch kdump code independent of the DT API.
Most reserved regions are owned by devices and do not contain data
useful for kernel crash analysis, so dumpable default to false.
Reusable CMA regions are different: their pages are handed back to the
buddy allocator and may contain key data for crash analysis, so set
dumpable to true in rmem_cma_setup().
Suggested-by: Rob Herring <robh@kernel.org>
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
Acked-by: Rob Herring (Arm) <robh@kernel.org>
---
include/linux/of_reserved_mem.h | 1 +
kernel/dma/contiguous.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
index 49da515859f2..99c0f3ccc297 100644
--- a/include/linux/of_reserved_mem.h
+++ b/include/linux/of_reserved_mem.h
@@ -15,6 +15,7 @@ struct reserved_mem {
phys_addr_t base;
phys_addr_t size;
void *priv;
+ bool dumpable;
};
struct reserved_mem_ops {
diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
index 90937dc7c627..d7bfc38ac762 100644
--- a/kernel/dma/contiguous.c
+++ b/kernel/dma/contiguous.c
@@ -567,6 +567,7 @@ static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
dma_contiguous_default_area = cma;
rmem->priv = cma;
+ rmem->dumpable = true;
pr_info("Reserved memory: created CMA memory pool at %pa, size %ld MiB\n",
&rmem->base, (unsigned long)rmem->size / SZ_1M);
--
2.43.0
^ permalink raw reply related [flat|nested] 26+ messages in thread* [RESEND PATCH v8 6/8] of: reserved_mem: add dumpable flag to opt-in vmcore
@ 2026-10-16 6:15 ` Wandun Chen
0 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
Add a 'dumpable' flag to struct reserved_mem to decide whether a
reserved area should be included in the kdump vmcore. Non-dumpable
regions are later marked MEMBLOCK_NODUMP; the filtering itself happens
in memblock, keeping the arch kdump code independent of the DT API.
Most reserved regions are owned by devices and do not contain data
useful for kernel crash analysis, so dumpable default to false.
Reusable CMA regions are different: their pages are handed back to the
buddy allocator and may contain key data for crash analysis, so set
dumpable to true in rmem_cma_setup().
Suggested-by: Rob Herring <robh@kernel.org>
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
Acked-by: Rob Herring (Arm) <robh@kernel.org>
---
include/linux/of_reserved_mem.h | 1 +
kernel/dma/contiguous.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
index 49da515859f2..99c0f3ccc297 100644
--- a/include/linux/of_reserved_mem.h
+++ b/include/linux/of_reserved_mem.h
@@ -15,6 +15,7 @@ struct reserved_mem {
phys_addr_t base;
phys_addr_t size;
void *priv;
+ bool dumpable;
};
struct reserved_mem_ops {
diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
index 90937dc7c627..d7bfc38ac762 100644
--- a/kernel/dma/contiguous.c
+++ b/kernel/dma/contiguous.c
@@ -567,6 +567,7 @@ static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
dma_contiguous_default_area = cma;
rmem->priv = cma;
+ rmem->dumpable = true;
pr_info("Reserved memory: created CMA memory pool at %pa, size %ld MiB\n",
&rmem->base, (unsigned long)rmem->size / SZ_1M);
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [RESEND PATCH v8 6/8] of: reserved_mem: add dumpable flag to opt-in vmcore
2026-10-16 6:15 ` Wandun Chen
(?)
@ 2026-10-16 6:24 ` sashiko-bot
-1 siblings, 0 replies; 26+ messages in thread
From: sashiko-bot @ 2026-10-16 6:24 UTC (permalink / raw)
To: Wandun Chen, robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, kexec
> From: Wandun Chen <chenwandun@lixiang.com>
>
> Add a 'dumpable' flag to struct reserved_mem to decide whether a
> reserved area should be included in the kdump vmcore. Non-dumpable
> regions are later marked MEMBLOCK_NODUMP; the filtering itself happens
> in memblock, keeping the arch kdump code independent of the DT API.
>
> Most reserved regions are owned by devices and do not contain data
> useful for kernel crash analysis, so dumpable default to false.
> Reusable CMA regions are different: their pages are handed back to the
> buddy allocator and may contain key data for crash analysis, so set
> dumpable to true in rmem_cma_setup().
>
> Suggested-by: Rob Herring <robh@kernel.org>
> Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016061549.4181390-1-chenwandun1@gmail.com?part=6
^ permalink raw reply [flat|nested] 26+ messages in thread
* [RESEND PATCH v8 7/8] of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP
2026-10-16 6:15 ` Wandun Chen
@ 2026-10-16 6:15 ` Wandun Chen
-1 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
Mark non-dumpable reserved-memory regions with MEMBLOCK_NODUMP so
kdump can omit them from the vmcore.
The marking is guarded by CONFIG_CRASH_DUMP so non-kdump kernels do not
pay the cost of splitting memblock.memory entries at NODUMP boundaries.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
---
drivers/of/fdt.c | 1 +
drivers/of/of_private.h | 1 +
drivers/of/of_reserved_mem.c | 15 +++++++++++++++
3 files changed, 17 insertions(+)
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index ecc923102622..a5f223a74b7e 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1285,6 +1285,7 @@ void __init unflatten_device_tree(void)
/* Save the statically-placed regions in the reserved_mem array */
fdt_scan_reserved_mem_late();
+ fdt_mark_reserve_mem_nodump();
/* Populate an empty root node when bootloader doesn't provide one */
if (!fdt) {
diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
index 0ae16da066e2..505735732c13 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -187,6 +187,7 @@ static inline struct device_node *__of_get_dma_parent(const struct device_node *
int fdt_scan_reserved_mem(void);
void __init fdt_scan_reserved_mem_late(void);
+void __init fdt_mark_reserve_mem_nodump(void);
bool of_fdt_device_is_available(const void *blob, unsigned long node);
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 8c9d6395d6a3..f29a07e8fb23 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -677,6 +677,21 @@ static void __init fdt_init_reserved_mem_node(unsigned long node, const char *un
reserved_mem_count++;
}
+void __init fdt_mark_reserve_mem_nodump(void)
+{
+ struct reserved_mem *rmem;
+ int i;
+
+ if (!IS_ENABLED(CONFIG_CRASH_DUMP))
+ return;
+
+ for (i = 0; i < reserved_mem_count; i++) {
+ rmem = &reserved_mem[i];
+ if (rmem->size && !rmem->dumpable)
+ memblock_mark_nodump(rmem->base, rmem->size);
+ }
+}
+
struct rmem_assigned_device {
struct device *dev;
struct reserved_mem *rmem;
--
2.43.0
^ permalink raw reply related [flat|nested] 26+ messages in thread* [RESEND PATCH v8 7/8] of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP
@ 2026-10-16 6:15 ` Wandun Chen
0 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
Mark non-dumpable reserved-memory regions with MEMBLOCK_NODUMP so
kdump can omit them from the vmcore.
The marking is guarded by CONFIG_CRASH_DUMP so non-kdump kernels do not
pay the cost of splitting memblock.memory entries at NODUMP boundaries.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
---
drivers/of/fdt.c | 1 +
drivers/of/of_private.h | 1 +
drivers/of/of_reserved_mem.c | 15 +++++++++++++++
3 files changed, 17 insertions(+)
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index ecc923102622..a5f223a74b7e 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1285,6 +1285,7 @@ void __init unflatten_device_tree(void)
/* Save the statically-placed regions in the reserved_mem array */
fdt_scan_reserved_mem_late();
+ fdt_mark_reserve_mem_nodump();
/* Populate an empty root node when bootloader doesn't provide one */
if (!fdt) {
diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
index 0ae16da066e2..505735732c13 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -187,6 +187,7 @@ static inline struct device_node *__of_get_dma_parent(const struct device_node *
int fdt_scan_reserved_mem(void);
void __init fdt_scan_reserved_mem_late(void);
+void __init fdt_mark_reserve_mem_nodump(void);
bool of_fdt_device_is_available(const void *blob, unsigned long node);
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 8c9d6395d6a3..f29a07e8fb23 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -677,6 +677,21 @@ static void __init fdt_init_reserved_mem_node(unsigned long node, const char *un
reserved_mem_count++;
}
+void __init fdt_mark_reserve_mem_nodump(void)
+{
+ struct reserved_mem *rmem;
+ int i;
+
+ if (!IS_ENABLED(CONFIG_CRASH_DUMP))
+ return;
+
+ for (i = 0; i < reserved_mem_count; i++) {
+ rmem = &reserved_mem[i];
+ if (rmem->size && !rmem->dumpable)
+ memblock_mark_nodump(rmem->base, rmem->size);
+ }
+}
+
struct rmem_assigned_device {
struct device *dev;
struct reserved_mem *rmem;
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [RESEND PATCH v8 7/8] of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP
2026-10-16 6:15 ` Wandun Chen
(?)
@ 2026-10-16 6:32 ` sashiko-bot
-1 siblings, 0 replies; 26+ messages in thread
From: sashiko-bot @ 2026-10-16 6:32 UTC (permalink / raw)
To: Wandun Chen, robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, devicetree, kexec, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] of: fdt: boot panic on sh due to memblock_mark_nodump splitting before resize
--
commit c3780e76cb8942c20c5a5a3858d45f390651c1c3
Author: Wandun Chen <chenwandun@lixiang.com>
of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP
Mark non-dumpable reserved-memory regions with MEMBLOCK_NODUMP so
kdump can omit them from the vmcore.
> diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
> index ecc9231026224..a5f223a74b7ea 100644
> --- a/drivers/of/fdt.c
> +++ b/drivers/of/fdt.c
> @@ -1285,6 +1285,7 @@ void __init unflatten_device_tree(void)
>
> /* Save the statically-placed regions in the reserved_mem array */
> fdt_scan_reserved_mem_late();
> + fdt_mark_reserve_mem_nodump();
[Severity: High]
Could this cause a boot panic on architectures like sh that call
unflatten_device_tree() before memblock resizing is allowed?
On the sh architecture, unflatten_device_tree() is called prior to
paging_init():
arch/sh/kernel/setup.c:setup_arch() {
...
#ifdef CONFIG_BUILTIN_DTB
unflatten_and_copy_device_tree();
#else
unflatten_device_tree();
#endif
paging_init();
...
}
Dynamic resizing of the memblock array is only enabled during paging_init():
arch/sh/mm/init.c:paging_init() {
...
memblock_enforce_memory_limit(memory_limit);
memblock_allow_resize();
...
}
Since fdt_mark_reserve_mem_nodump() applies MEMBLOCK_NODUMP flags,
it forces memblock.memory regions to be split. Because memblock_can_resize
is 0 at this early stage, if the device tree specifies enough non-dumpable
reserved memory regions to exceed INIT_MEMBLOCK_MEMORY_REGIONS,
memblock_double_array() will unconditionally panic the kernel during early
boot.
>
> /* Populate an empty root node when bootloader doesn't provide one */
> if (!fdt) {
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016061549.4181390-1-chenwandun1@gmail.com?part=7
^ permalink raw reply [flat|nested] 26+ messages in thread
* [RESEND PATCH v8 8/8] crash_core: skip MEMBLOCK_NODUMP regions when building vmcore ELF header
2026-10-16 6:15 ` Wandun Chen
@ 2026-10-16 6:15 ` Wandun Chen
-1 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
Reserve regions (for GPU, DSP, ...) carry no data useful for crash
analysis. Exclude MEMBLOCK_NODUMP regions from the vmcore ELF header to
reduce vmcore size and capture time. crash_should_skip_region() now also
returns true for MEMBLOCK_NODUMP.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Baoquan He <baoquan.he@linux.dev>
---
kernel/crash_core.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
index e161c8b65e00..0e2ddc933b22 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -283,10 +283,10 @@ static struct crash_mem *alloc_cmem(unsigned int nr_ranges)
}
#ifdef CONFIG_ARCH_KEEP_MEMBLOCK
-/* Exclude NOMAP regions from the vmcore. */
+/* Exclude NOMAP and NODUMP regions from the vmcore. */
static bool crash_should_skip_region(struct memblock_region *reg)
{
- return memblock_is_nomap(reg);
+ return memblock_is_nomap(reg) || memblock_is_nodump(reg);
}
unsigned int __weak arch_get_system_nr_ranges(void)
--
2.43.0
^ permalink raw reply related [flat|nested] 26+ messages in thread* [RESEND PATCH v8 8/8] crash_core: skip MEMBLOCK_NODUMP regions when building vmcore ELF header
@ 2026-10-16 6:15 ` Wandun Chen
0 siblings, 0 replies; 26+ messages in thread
From: Wandun Chen @ 2026-10-16 6:15 UTC (permalink / raw)
To: robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, linux-arm-kernel, linux-kernel, loongarch,
linux-riscv, devicetree, kexec, linux-mm, iommu
From: Wandun Chen <chenwandun@lixiang.com>
Reserve regions (for GPU, DSP, ...) carry no data useful for crash
analysis. Exclude MEMBLOCK_NODUMP regions from the vmcore ELF header to
reduce vmcore size and capture time. crash_should_skip_region() now also
returns true for MEMBLOCK_NODUMP.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Baoquan He <baoquan.he@linux.dev>
---
kernel/crash_core.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
index e161c8b65e00..0e2ddc933b22 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -283,10 +283,10 @@ static struct crash_mem *alloc_cmem(unsigned int nr_ranges)
}
#ifdef CONFIG_ARCH_KEEP_MEMBLOCK
-/* Exclude NOMAP regions from the vmcore. */
+/* Exclude NOMAP and NODUMP regions from the vmcore. */
static bool crash_should_skip_region(struct memblock_region *reg)
{
- return memblock_is_nomap(reg);
+ return memblock_is_nomap(reg) || memblock_is_nodump(reg);
}
unsigned int __weak arch_get_system_nr_ranges(void)
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [RESEND PATCH v8 8/8] crash_core: skip MEMBLOCK_NODUMP regions when building vmcore ELF header
2026-10-16 6:15 ` Wandun Chen
(?)
@ 2026-10-16 6:25 ` sashiko-bot
-1 siblings, 0 replies; 26+ messages in thread
From: sashiko-bot @ 2026-10-16 6:25 UTC (permalink / raw)
To: Wandun Chen, robh, baoquan.he, rppt, m.szyprowski
Cc: catalin.marinas, will, mark.rutland, chenhuacai, kernel, pjw,
palmer, aou, alex, tglx, mingo, bp, dave.hansen, x86, hpa,
saravanak, akpm, pasha.tatashin, pratyush, ruirui.yang,
robin.murphy, kexec
> From: Wandun Chen <chenwandun@lixiang.com>
>
> Reserve regions (for GPU, DSP, ...) carry no data useful for crash
> analysis. Exclude MEMBLOCK_NODUMP regions from the vmcore ELF header to
> reduce vmcore size and capture time. crash_should_skip_region() now also
> returns true for MEMBLOCK_NODUMP.
>
> Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016061549.4181390-1-chenwandun1@gmail.com?part=8
^ permalink raw reply [flat|nested] 26+ messages in thread