* [PATCH v7 1/9] riscv: build crash_mem ranges from memblock instead of resource tree
2026-09-22 8:42 [PATCH v7 0/9] kdump: reduce vmcore size and capture time Wandun Chen
@ 2026-09-22 8:42 ` Wandun Chen
2026-09-22 8:59 ` sashiko-bot
2026-09-22 8:42 ` [PATCH v7 2/9] crash_core: fold duplicated memblock arch hooks into the weak default Wandun Chen
` (7 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Wandun Chen @ 2026-09-22 8:42 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 a590db7687c8..991657b2465f 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 [flat|nested] 19+ messages in thread* Re: [PATCH v7 1/9] riscv: build crash_mem ranges from memblock instead of resource tree
2026-09-22 8:42 ` [PATCH v7 1/9] riscv: build crash_mem ranges from memblock instead of resource tree Wandun Chen
@ 2026-09-22 8:59 ` sashiko-bot
0 siblings, 0 replies; 19+ messages in thread
From: sashiko-bot @ 2026-09-22 8:59 UTC (permalink / raw)
To: robh, rppt, Wandun Chen, baoquan.he, m.szyprowski
Cc: pasha.tatashin, aou, linux-mm, conor+dt, mark.rutland,
dave.hansen, devicetree, bp, catalin.marinas, mingo, ruirui.yang,
iommu, kexec, saravanak, pjw, linux-kernel, hpa, alex,
chenhuacai, x86, akpm, robin.murphy, loongarch, linux-arm-kernel,
linux-riscv, kernel, will, palmer, pratyush, tglx
> 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/20260922084256.1515554-1-chenwandun1@gmail.com?part=1
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v7 2/9] crash_core: fold duplicated memblock arch hooks into the weak default
2026-09-22 8:42 [PATCH v7 0/9] kdump: reduce vmcore size and capture time Wandun Chen
2026-09-22 8:42 ` [PATCH v7 1/9] riscv: build crash_mem ranges from memblock instead of resource tree Wandun Chen
@ 2026-09-22 8:42 ` Wandun Chen
2026-09-22 8:56 ` sashiko-bot
2026-09-22 8:42 ` [PATCH v7 3/9] crash_core: serialize crash header preparation against hotplug Wandun Chen
` (6 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Wandun Chen @ 2026-09-22 8:42 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 | 25 +++++++++++++++++--
4 files changed, 23 insertions(+), 84 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..d201638d11f3 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -281,8 +281,29 @@ static struct crash_mem *alloc_cmem(unsigned int nr_ranges)
return cmem;
}
-unsigned int __weak arch_get_system_nr_ranges(void) { return 0; }
-int __weak arch_crash_populate_cmem(struct crash_mem *cmem) { return -1; }
+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;
+}
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 [flat|nested] 19+ messages in thread* Re: [PATCH v7 2/9] crash_core: fold duplicated memblock arch hooks into the weak default
2026-09-22 8:42 ` [PATCH v7 2/9] crash_core: fold duplicated memblock arch hooks into the weak default Wandun Chen
@ 2026-09-22 8:56 ` sashiko-bot
0 siblings, 0 replies; 19+ messages in thread
From: sashiko-bot @ 2026-09-22 8:56 UTC (permalink / raw)
To: Wandun Chen, m.szyprowski, robh, rppt, baoquan.he
Cc: linux-arm-kernel, dave.hansen, tglx, will, bp, mark.rutland, pjw,
ruirui.yang, hpa, palmer, aou, akpm, mingo, pasha.tatashin,
linux-riscv, conor+dt, pratyush, alex, x86, loongarch,
devicetree, chenhuacai, linux-kernel, saravanak, kexec,
robin.murphy, linux-mm, catalin.marinas, iommu, kernel
> 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/20260922084256.1515554-1-chenwandun1@gmail.com?part=2
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v7 3/9] crash_core: serialize crash header preparation against hotplug
2026-09-22 8:42 [PATCH v7 0/9] kdump: reduce vmcore size and capture time Wandun Chen
2026-09-22 8:42 ` [PATCH v7 1/9] riscv: build crash_mem ranges from memblock instead of resource tree Wandun Chen
2026-09-22 8:42 ` [PATCH v7 2/9] crash_core: fold duplicated memblock arch hooks into the weak default Wandun Chen
@ 2026-09-22 8:42 ` Wandun Chen
2026-09-22 9:03 ` sashiko-bot
2026-09-22 8:42 ` [PATCH v7 4/9] crash_core: replace for_each_mem_range() with for_each_mem_region() Wandun Chen
` (5 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Wandun Chen @ 2026-09-22 8:42 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 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/x86/kernel/crash.c | 2 +-
include/linux/crash_core.h | 2 ++
kernel/crash_core.c | 17 +++++++++++++++--
3 files changed, 18 insertions(+), 3 deletions(-)
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 d201638d11f3..d0cc2496dc09 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>
@@ -338,8 +339,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;
@@ -376,6 +377,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 [flat|nested] 19+ messages in thread* Re: [PATCH v7 3/9] crash_core: serialize crash header preparation against hotplug
2026-09-22 8:42 ` [PATCH v7 3/9] crash_core: serialize crash header preparation against hotplug Wandun Chen
@ 2026-09-22 9:03 ` sashiko-bot
0 siblings, 0 replies; 19+ messages in thread
From: sashiko-bot @ 2026-09-22 9:03 UTC (permalink / raw)
To: m.szyprowski, Wandun Chen, baoquan.he, robh, rppt
Cc: devicetree, ruirui.yang, linux-arm-kernel, alex, pjw, tglx, aou,
bp, hpa, akpm, mingo, linux-kernel, dave.hansen, saravanak, x86,
will, kexec, linux-riscv, linux-mm, chenhuacai, iommu,
mark.rutland, loongarch, robin.murphy, kernel, pratyush,
catalin.marinas, palmer, conor+dt, pasha.tatashin
> 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 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/20260922084256.1515554-1-chenwandun1@gmail.com?part=3
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v7 4/9] crash_core: replace for_each_mem_range() with for_each_mem_region()
2026-09-22 8:42 [PATCH v7 0/9] kdump: reduce vmcore size and capture time Wandun Chen
` (2 preceding siblings ...)
2026-09-22 8:42 ` [PATCH v7 3/9] crash_core: serialize crash header preparation against hotplug Wandun Chen
@ 2026-09-22 8:42 ` Wandun Chen
2026-09-22 8:56 ` sashiko-bot
2026-09-22 8:42 ` [PATCH v7 5/9] memblock: introduce MEMBLOCK_NODUMP flag Wandun Chen
` (4 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Wandun Chen @ 2026-09-22 8:42 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 d0cc2496dc09..c7acb2e449df 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -270,6 +270,12 @@ int crash_prepare_elf64_headers(struct crash_mem *mem, int need_kernel_map,
return 0;
}
+/* Exclude NOMAP regions from the vmcore. */
+static bool crash_should_skip_region(struct memblock_region *reg)
+{
+ return memblock_is_nomap(reg);
+}
+
static struct crash_mem *alloc_cmem(unsigned int nr_ranges)
{
struct crash_mem *cmem;
@@ -285,22 +291,25 @@ static struct crash_mem *alloc_cmem(unsigned int nr_ranges)
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 [flat|nested] 19+ messages in thread* Re: [PATCH v7 4/9] crash_core: replace for_each_mem_range() with for_each_mem_region()
2026-09-22 8:42 ` [PATCH v7 4/9] crash_core: replace for_each_mem_range() with for_each_mem_region() Wandun Chen
@ 2026-09-22 8:56 ` sashiko-bot
0 siblings, 0 replies; 19+ messages in thread
From: sashiko-bot @ 2026-09-22 8:56 UTC (permalink / raw)
To: robh, Wandun Chen, rppt, baoquan.he, m.szyprowski
Cc: linux-kernel, ruirui.yang, loongarch, tglx, mingo, saravanak,
iommu, pratyush, conor+dt, dave.hansen, chenhuacai, aou, pjw,
linux-arm-kernel, pasha.tatashin, x86, akpm, linux-riscv, kexec,
hpa, palmer, alex, mark.rutland, will, kernel, catalin.marinas,
bp, robin.murphy, linux-mm, devicetree
> 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/20260922084256.1515554-1-chenwandun1@gmail.com?part=4
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v7 5/9] memblock: introduce MEMBLOCK_NODUMP flag
2026-09-22 8:42 [PATCH v7 0/9] kdump: reduce vmcore size and capture time Wandun Chen
` (3 preceding siblings ...)
2026-09-22 8:42 ` [PATCH v7 4/9] crash_core: replace for_each_mem_range() with for_each_mem_region() Wandun Chen
@ 2026-09-22 8:42 ` Wandun Chen
2026-09-22 9:02 ` sashiko-bot
2026-09-22 8:42 ` [PATCH v7 6/9] of: reserved_mem: add dumpable flag to opt-in vmcore Wandun Chen
` (3 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Wandun Chen @ 2026-09-22 8:42 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 and /memreserve/ entries.
Regions in /memreserve/ (such as the initrd) may be reserved at the
beginning and freed later, so we also need to clear the flag when
freeing reserved memory.
Suggested-by: Rob Herring <robh@kernel.org>
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
---
include/linux/memblock.h | 9 +++++++++
mm/memblock.c | 43 ++++++++++++++++++++++++++++++++++++++--
2 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index aa845f488327..0126b47bc3c4 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -52,6 +52,8 @@ extern unsigned long long max_possible_pfn;
* kernel that we 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_SCRATCH = 0x40, /* scratch memory for kexec handover */
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_scratch(phys_addr_t base, phys_addr_t size);
int memblock_clear_kho_scratch(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_scratch(struct memblock_region *m)
return m->flags & MEMBLOCK_KHO_SCRATCH;
}
+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 ea0de4b5f356..48cabfe5cdf1 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -929,6 +929,8 @@ static unsigned long __free_reserved_area(phys_addr_t start, phys_addr_t end,
return pages;
}
+static int memblock_clear_nodump(phys_addr_t base, phys_addr_t size);
+
unsigned long free_reserved_area(void *start, void *end, int poison, const char *s)
{
phys_addr_t start_pa, end_pa;
@@ -949,9 +951,13 @@ unsigned long free_reserved_area(void *start, void *end, int poison, const char
}
if (IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK)) {
- if (start_pa < end_pa)
+ if (start_pa < end_pa) {
memblock_remove_range(&memblock.reserved,
start_pa, end_pa - start_pa);
+
+ if (IS_ENABLED(CONFIG_CRASH_DUMP))
+ memblock_clear_nodump(start_pa, end_pa - start_pa);
+ }
}
pages = __free_reserved_area(start_pa, end_pa, poison);
@@ -995,8 +1001,11 @@ int __init_memblock memblock_phys_free(phys_addr_t base, phys_addr_t size)
kmemleak_free_part_phys(base, size);
- if (!slab_is_available() || IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK))
+ if (!slab_is_available() || IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK)) {
ret = memblock_remove_range(&memblock.reserved, base, size);
+ if (IS_ENABLED(CONFIG_CRASH_DUMP))
+ memblock_clear_nodump(base, size);
+ }
if (slab_is_available())
__free_reserved_area(base, base + size, -1);
@@ -1204,6 +1213,35 @@ __init int memblock_clear_kho_scratch(phys_addr_t base, phys_addr_t size)
MEMBLOCK_KHO_SCRATCH);
}
+/**
+ * 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);
+}
+
+/**
+ * memblock_clear_nodump - Clear a memory region with flag MEMBLOCK_NODUMP.
+ * @base: the base phys addr of the region
+ * @size: the size of the region
+ *
+ * Return: 0 on success, -errno on failure.
+ */
+static int __init_memblock memblock_clear_nodump(phys_addr_t base,
+ phys_addr_t size)
+{
+ return memblock_setclr_flag(&memblock.memory, base, size, 0,
+ MEMBLOCK_NODUMP);
+}
+
static bool should_skip_region(struct memblock_type *type,
struct memblock_region *m,
int nid, int flags)
@@ -2880,6 +2918,7 @@ static const char * const flagname[] = {
[ilog2(MEMBLOCK_RSRV_KERN)] = "RSV_KERN",
[ilog2(MEMBLOCK_KHO_SCRATCH)] = "KHO_SCRATCH",
[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 [flat|nested] 19+ messages in thread* Re: [PATCH v7 5/9] memblock: introduce MEMBLOCK_NODUMP flag
2026-09-22 8:42 ` [PATCH v7 5/9] memblock: introduce MEMBLOCK_NODUMP flag Wandun Chen
@ 2026-09-22 9:02 ` sashiko-bot
0 siblings, 0 replies; 19+ messages in thread
From: sashiko-bot @ 2026-09-22 9:02 UTC (permalink / raw)
To: Wandun Chen, robh, rppt, baoquan.he, m.szyprowski
Cc: aou, palmer, akpm, conor+dt, bp, pasha.tatashin, ruirui.yang,
mingo, hpa, saravanak, x86, robin.murphy, catalin.marinas, will,
mark.rutland, alex, pratyush, kernel, devicetree,
linux-arm-kernel, linux-kernel, iommu, dave.hansen, kexec,
linux-riscv, pjw, loongarch, tglx, linux-mm, chenhuacai
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] mm: lockless mutation of memblock.memory causes UAF in concurrent readers
--
commit 3e0d4f57949330268c708beeb66dc1c0fb65db32
Author: Wandun Chen <chenwandun@lixiang.com>
Subject: memblock: introduce MEMBLOCK_NODUMP flag
This patch introduces the MEMBLOCK_NODUMP flag to mark memory regions that
should be excluded from kdump vmcores. It also adds logic to clear this flag
when reserved memory, such as the initrd, is freed so the memory can be
properly reused.
> diff --git a/mm/memblock.c b/mm/memblock.c
> index ea0de4b5f3568..48cabfe5cdf16 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
[ ... ]
> @@ -949,9 +951,13 @@ unsigned long free_reserved_area(void *start, void *end, int poison, const char
> }
>
> if (IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK)) {
> - if (start_pa < end_pa)
> + if (start_pa < end_pa) {
> memblock_remove_range(&memblock.reserved,
> start_pa, end_pa - start_pa);
> +
> + if (IS_ENABLED(CONFIG_CRASH_DUMP))
> + memblock_clear_nodump(start_pa, end_pa - start_pa);
> + }
> }
[Severity: High]
Could this lockless mutation of memblock.memory race with concurrent readers?
This code path is triggered during asynchronous initrd freeing
(e.g., via do_populate_rootfs using async_schedule_domain).
Calling memblock_clear_nodump() modifies the memblock.memory array locklessly
via memblock_setclr_flag() and memblock_isolate_range().
memblock_isolate_range() can split ranges using memmove(), which disrupts
array ordering, and can even call memblock_double_array() which kfree()s
the old array.
Concurrently, subsystems rely on memblock.memory being immutable after early
boot. For example, on ARM64, ioremap() calls pfn_is_map_memory(), which
performs a lockless binary search (memblock_search()) directly on
memblock.memory.regions.
If memblock_clear_nodump() splits or reallocates the array while ioremap()
is executing during driver probes, could this result in a use-after-free
on the freed array or an out-of-bounds access from broken binary search
invariants?
[ ... ]
> @@ -995,8 +1001,11 @@ int __init_memblock memblock_phys_free(phys_addr_t base, phys_addr_t size)
>
> kmemleak_free_part_phys(base, size);
>
> - if (!slab_is_available() || IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK))
> + if (!slab_is_available() || IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK)) {
> ret = memblock_remove_range(&memblock.reserved, base, size);
> + if (IS_ENABLED(CONFIG_CRASH_DUMP))
> + memblock_clear_nodump(base, size);
> + }
[Severity: High]
Similar to the above, does this introduce the same lockless mutation risk
when called during runtime module unloads or CMA frees?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260922084256.1515554-1-chenwandun1@gmail.com?part=5
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v7 6/9] of: reserved_mem: add dumpable flag to opt-in vmcore
2026-09-22 8:42 [PATCH v7 0/9] kdump: reduce vmcore size and capture time Wandun Chen
` (4 preceding siblings ...)
2026-09-22 8:42 ` [PATCH v7 5/9] memblock: introduce MEMBLOCK_NODUMP flag Wandun Chen
@ 2026-09-22 8:42 ` Wandun Chen
2026-09-22 8:54 ` sashiko-bot
2026-09-22 8:42 ` [PATCH v7 7/9] of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP Wandun Chen
` (2 subsequent siblings)
8 siblings, 1 reply; 19+ messages in thread
From: Wandun Chen @ 2026-09-22 8:42 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().
The dumpable flag is also used to check /memreserve/ entries for overlap
with other dumpable regions.
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 [flat|nested] 19+ messages in thread* Re: [PATCH v7 6/9] of: reserved_mem: add dumpable flag to opt-in vmcore
2026-09-22 8:42 ` [PATCH v7 6/9] of: reserved_mem: add dumpable flag to opt-in vmcore Wandun Chen
@ 2026-09-22 8:54 ` sashiko-bot
0 siblings, 0 replies; 19+ messages in thread
From: sashiko-bot @ 2026-09-22 8:54 UTC (permalink / raw)
To: robh, baoquan.he, rppt, Wandun Chen, m.szyprowski
Cc: mingo, saravanak, pjw, linux-riscv, pasha.tatashin, kernel,
iommu, ruirui.yang, tglx, devicetree, palmer, aou,
catalin.marinas, dave.hansen, loongarch, robin.murphy,
linux-kernel, bp, pratyush, alex, chenhuacai, linux-arm-kernel,
hpa, linux-mm, kexec, mark.rutland, x86, akpm, conor+dt, will
> 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().
>
> The dumpable flag is also used to check /memreserve/ entries for overlap
> with other dumpable regions.
>
> 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/20260922084256.1515554-1-chenwandun1@gmail.com?part=6
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v7 7/9] of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP
2026-09-22 8:42 [PATCH v7 0/9] kdump: reduce vmcore size and capture time Wandun Chen
` (5 preceding siblings ...)
2026-09-22 8:42 ` [PATCH v7 6/9] of: reserved_mem: add dumpable flag to opt-in vmcore Wandun Chen
@ 2026-09-22 8:42 ` Wandun Chen
2026-09-22 9:01 ` sashiko-bot
2026-09-22 8:42 ` [PATCH v7 8/9] of: reserved_mem: mark /memreserve/ entries as MEMBLOCK_NODUMP Wandun Chen
2026-09-22 8:42 ` [PATCH v7 9/9] crash_core: skip MEMBLOCK_NODUMP regions when building vmcore ELF header Wandun Chen
8 siblings, 1 reply; 19+ messages in thread
From: Wandun Chen @ 2026-09-22 8:42 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 a64afc3ded3d..286fd4db6312 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 [flat|nested] 19+ messages in thread* Re: [PATCH v7 7/9] of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP
2026-09-22 8:42 ` [PATCH v7 7/9] of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP Wandun Chen
@ 2026-09-22 9:01 ` sashiko-bot
0 siblings, 0 replies; 19+ messages in thread
From: sashiko-bot @ 2026-09-22 9:01 UTC (permalink / raw)
To: robh, Wandun Chen, m.szyprowski, baoquan.he, rppt
Cc: aou, akpm, pjw, chenhuacai, mingo, kexec, palmer, pasha.tatashin,
hpa, ruirui.yang, iommu, pratyush, kernel, linux-arm-kernel,
linux-mm, robin.murphy, devicetree, catalin.marinas, alex,
linux-kernel, x86, will, loongarch, saravanak, linux-riscv,
conor+dt, tglx, mark.rutland, bp, dave.hansen
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] of: reserved_mem: unconditional MEMBLOCK_NODUMP breaks firmware debugging
--
commit 70f4cbca539766519d8967f7e857d2db27db4c13
Author: Wandun Chen <chenwandun@lixiang.com>
of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP
This commit marks non-dumpable reserved-memory regions with MEMBLOCK_NODUMP
so kdump can omit them from the vmcore. The marking is guarded by
CONFIG_CRASH_DUMP to avoid splitting memblock.memory entries unnecessarily
on non-kdump kernels.
> diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
> --- 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(...)
> 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);
[Severity: High]
Does this unconditional masking prevent debugging of coprocessor memory and
firmware state in vmcores?
Since only the CMA driver sets dumpable to true, it appears all other
generic /reserved-memory regions (such as DSP logs or ramoops) default
to false.
Because fdt_mark_reserve_mem_nodump() unconditionally applies
MEMBLOCK_NODUMP to these regions, and there is no Device Tree property
provided to opt them back in, is there a risk that system administrators
will lose the ability to inspect these regions after a crash?
> + }
> +}
> +
> struct rmem_assigned_device {
> struct device *dev;
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260922084256.1515554-1-chenwandun1@gmail.com?part=7
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v7 8/9] of: reserved_mem: mark /memreserve/ entries as MEMBLOCK_NODUMP
2026-09-22 8:42 [PATCH v7 0/9] kdump: reduce vmcore size and capture time Wandun Chen
` (6 preceding siblings ...)
2026-09-22 8:42 ` [PATCH v7 7/9] of: reserved_mem: mark /reserved-memory entries with MEMBLOCK_NODUMP Wandun Chen
@ 2026-09-22 8:42 ` Wandun Chen
2026-09-22 9:04 ` sashiko-bot
2026-09-22 8:42 ` [PATCH v7 9/9] crash_core: skip MEMBLOCK_NODUMP regions when building vmcore ELF header Wandun Chen
8 siblings, 1 reply; 19+ messages in thread
From: Wandun Chen @ 2026-09-22 8:42 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>
The /memreserve/ entries are memory reservations made by the bootloader
or firmware, their contents are not needed for kernel crash analysis,
so mark them MEMBLOCK_NODUMP to have kdump omit them from the vmcore.
Entries that overlap a dumpable region (such as CMA) are left unmarked,
because the pages of a dumpable region may carry crash-relevant data.
Signed-off-by: Wandun Chen <chenwandun@lixiang.com>
Tested-by: Meijing Zhao <zhaomeijing@lixiang.com>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/of/fdt.c | 1 +
drivers/of/of_private.h | 1 +
drivers/of/of_reserved_mem.c | 33 +++++++++++++++++++++++++++++++++
3 files changed, 35 insertions(+)
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 286fd4db6312..9a727941b5af 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1286,6 +1286,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();
+ fdt_mark_memreserve_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 505735732c13..6497404ec751 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -188,6 +188,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);
+void __init fdt_mark_memreserve_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 f29a07e8fb23..a42cf6eac55b 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -251,6 +251,39 @@ static void __init __rmem_check_for_overlap(void)
}
}
+void __init fdt_mark_memreserve_nodump(void)
+{
+ u64 base, size;
+ int n;
+ const void *fdt = initial_boot_params;
+
+ if (!IS_ENABLED(CONFIG_CRASH_DUMP))
+ return;
+
+ if (!fdt)
+ return;
+
+ for (n = 0; ; n++) {
+ int i;
+
+ if (fdt_get_mem_rsv(fdt, n, &base, &size))
+ break;
+ if (!size)
+ break;
+
+ for (i = 0; i < reserved_mem_count; i++) {
+ struct reserved_mem *rmem = &reserved_mem[i];
+
+ if (rmem->dumpable &&
+ base < (u64)rmem->base + (u64)rmem->size &&
+ (u64)rmem->base < base + size)
+ break;
+ }
+ if (i == reserved_mem_count)
+ memblock_mark_nodump(base, size);
+ }
+}
+
/**
* fdt_scan_reserved_mem_late() - Scan FDT and initialize remaining reserved
* memory regions.
--
2.43.0
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [PATCH v7 8/9] of: reserved_mem: mark /memreserve/ entries as MEMBLOCK_NODUMP
2026-09-22 8:42 ` [PATCH v7 8/9] of: reserved_mem: mark /memreserve/ entries as MEMBLOCK_NODUMP Wandun Chen
@ 2026-09-22 9:04 ` sashiko-bot
0 siblings, 0 replies; 19+ messages in thread
From: sashiko-bot @ 2026-09-22 9:04 UTC (permalink / raw)
To: robh, baoquan.he, Wandun Chen, rppt, m.szyprowski
Cc: saravanak, pjw, conor+dt, iommu, ruirui.yang, linux-kernel,
mark.rutland, loongarch, tglx, bp, x86, pratyush, kexec,
chenhuacai, hpa, pasha.tatashin, mingo, linux-mm, robin.murphy,
linux-riscv, aou, linux-arm-kernel, alex, catalin.marinas, will,
devicetree, dave.hansen, akpm, palmer, kernel
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] of/fdt: silent u64 truncation in fdt_mark_memreserve_nodump causes nodump false positives
--
commit 070ed699ada4d456618a640c6ad541abbec98f95
Author: Wandun Chen <chenwandun@lixiang.com>
of: reserved_mem: mark /memreserve/ entries as MEMBLOCK_NODUMP
The /memreserve/ entries are memory reservations made by the bootloader
or firmware, their contents are not needed for kernel crash analysis. This
commit marks them MEMBLOCK_NODUMP to omit them from the vmcore, while leaving
overlapping dumpable regions unmarked.
> diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
> index f29a07e8fb23e..a42cf6eac55b5 100644
> --- a/drivers/of/of_reserved_mem.c
> +++ b/drivers/of/of_reserved_mem.c
[ ... ]
> @@ -251,6 +251,39 @@ static void __init __rmem_check_for_overlap(void)
> }
> }
>
> +void __init fdt_mark_memreserve_nodump(void)
> +{
> + u64 base, size;
> + int n;
> + const void *fdt = initial_boot_params;
[ ... ]
> + for (i = 0; i < reserved_mem_count; i++) {
> + struct reserved_mem *rmem = &reserved_mem[i];
> +
> + if (rmem->dumpable &&
> + base < (u64)rmem->base + (u64)rmem->size &&
> + (u64)rmem->base < base + size)
> + break;
> + }
> + if (i == reserved_mem_count)
> + memblock_mark_nodump(base, size);
[Severity: Medium]
Is there a risk of silent truncation here when passing u64 arguments to
memblock_mark_nodump() on 32-bit architectures?
The u64 base and size variables are passed directly to memblock_mark_nodump()
which takes phys_addr_t arguments. On a 32-bit architecture where phys_addr_t
is 32-bit, if the device tree contains a /memreserve/ entry with an address
greater than 4GB, fdt_mark_memreserve_nodump() reads it as a 64-bit value.
It performs a 64-bit overlap check against dumpable regions in reserved_mem.
Because the upper 32 bits differ, it concludes there is no overlap. It then
calls memblock_mark_nodump(), where the compiler silently truncates base to 32
bits.
Could this incorrectly mark the lower 32-bit address as MEMBLOCK_NODUMP,
mistakenly excluding any dumpable region located there that the overlap
check was intended to protect?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260922084256.1515554-1-chenwandun1@gmail.com?part=8
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v7 9/9] crash_core: skip MEMBLOCK_NODUMP regions when building vmcore ELF header
2026-09-22 8:42 [PATCH v7 0/9] kdump: reduce vmcore size and capture time Wandun Chen
` (7 preceding siblings ...)
2026-09-22 8:42 ` [PATCH v7 8/9] of: reserved_mem: mark /memreserve/ entries as MEMBLOCK_NODUMP Wandun Chen
@ 2026-09-22 8:42 ` Wandun Chen
2026-09-22 9:02 ` sashiko-bot
8 siblings, 1 reply; 19+ messages in thread
From: Wandun Chen @ 2026-09-22 8:42 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 c7acb2e449df..fdfeee5afa1a 100644
--- a/kernel/crash_core.c
+++ b/kernel/crash_core.c
@@ -270,10 +270,10 @@ int crash_prepare_elf64_headers(struct crash_mem *mem, int need_kernel_map,
return 0;
}
-/* 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);
}
static struct crash_mem *alloc_cmem(unsigned int nr_ranges)
--
2.43.0
^ permalink raw reply [flat|nested] 19+ messages in thread* Re: [PATCH v7 9/9] crash_core: skip MEMBLOCK_NODUMP regions when building vmcore ELF header
2026-09-22 8:42 ` [PATCH v7 9/9] crash_core: skip MEMBLOCK_NODUMP regions when building vmcore ELF header Wandun Chen
@ 2026-09-22 9:02 ` sashiko-bot
0 siblings, 0 replies; 19+ messages in thread
From: sashiko-bot @ 2026-09-22 9:02 UTC (permalink / raw)
To: baoquan.he, m.szyprowski, Wandun Chen, rppt, robh
Cc: devicetree, linux-mm, chenhuacai, palmer, linux-kernel, aou,
conor+dt, kernel, linux-arm-kernel, loongarch, will, saravanak,
akpm, iommu, tglx, pasha.tatashin, dave.hansen, x86, pjw, bp,
mark.rutland, ruirui.yang, catalin.marinas, hpa, alex, pratyush,
robin.murphy, mingo, kexec, linux-riscv
> 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/20260922084256.1515554-1-chenwandun1@gmail.com?part=9
^ permalink raw reply [flat|nested] 19+ messages in thread