* [PATCH v2 0/3] of: reserved_mem: fixes and cleanups
@ 2026-05-19 8:24 Wandun Chen
2026-05-19 8:24 ` [PATCH v2 1/3] of: reserved_mem: avoid unnecessary memory allocation when __reserved_mem_check_root() fails Wandun Chen
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Wandun Chen @ 2026-05-19 8:24 UTC (permalink / raw)
To: devicetree, linux-kernel, zhaomeijing; +Cc: robh, saravanak
This is v2 of the OF reserved memory fixes/cleanups series.
The original v1 [1] contains two parts of work:
- Bug fixes and small cleanups about reserved memory.
- A vmcore size optimization that exclude reserved memory out of
vmcore.
For the convenience of review, I have split it into two independent
patchsets. This patchset only contains bug fixes and cleanups
content, while the content optimized for vmcore size will be in
another patchset.
v1 --> v2:
1. Add new patch 1, to fix unnecessary memory allocation.
2. Support only one entry in reg property in patch 3, suggested by
Rob Herring [2].
3. Per Rob's review on v1 2/11 [3], drop patch about "rejecting
reserved memory outside physical memory range" due to potential
abuse.
4. Drop patch about "of: reserved_mem: avoid unconditional save of
reg entries in fdt_scan_reserved_mem_late()" due to a
misunderstanding on my side.
5. Update commit message.
[1] https://lore.kernel.org/lkml/20260429065831.1510858-1-chenwandun@lixiang.com/
[2] https://lore.kernel.org/all/20260429065831.1510858-1-chenwandun@lixiang.com/T/#m29fa0f1c22c23e6343070e70f905c9482f930901
[3] https://lore.kernel.org/all/20260429065831.1510858-1-chenwandun@lixiang.com/T/#m5948f8679540fb361e7f432137babb4609ff154f
Wandun Chen (3):
of: reserved_mem: avoid unnecessary memory allocation when
__reserved_mem_check_root() fails
of: reserved_mem: clean up redundant alloc_reserved_mem_array() call
of: reserved_mem: only support one <base size> entry in reg property
drivers/of/of_reserved_mem.c | 48 +++++++++++++++++++++---------------
1 file changed, 28 insertions(+), 20 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH v2 1/3] of: reserved_mem: avoid unnecessary memory allocation when __reserved_mem_check_root() fails 2026-05-19 8:24 [PATCH v2 0/3] of: reserved_mem: fixes and cleanups Wandun Chen @ 2026-05-19 8:24 ` Wandun Chen 2026-05-20 7:44 ` Krzysztof Kozlowski 2026-05-19 8:24 ` [PATCH v2 2/3] of: reserved_mem: clean up redundant alloc_reserved_mem_array() call Wandun Chen 2026-05-19 8:24 ` [PATCH v2 3/3] of: reserved_mem: only support one <base size> entry in reg property Wandun Chen 2 siblings, 1 reply; 8+ messages in thread From: Wandun Chen @ 2026-05-19 8:24 UTC (permalink / raw) To: devicetree, linux-kernel, zhaomeijing; +Cc: robh, saravanak total_reserved_mem_cnt will keep the init value (MAX_RESERVED_REGIONS) in fdt_scan_reserved_mem() if __reserved_mem_check_root() fails. fdt_scan_reserved_mem_late() calls alloc_reserved_mem_array() to allocate memory according to total_reserved_mem_cnt before __reserved_mem_check_root(), so if __reserved_mem_check_root() fails, the allocated array has nowhere to be used, so no need to allocate memory. Move alloc_reserved_mem_array() after __reserved_mem_check_root() to avoid potential memory waste. Signed-off-by: Wandun Chen <chenwandun@lixiang.com> Tested-by: Meijing Zhao <zhaomeijing@lixiang.com> --- drivers/of/of_reserved_mem.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 8d5777cb5d1b..7856dc857d65 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -265,14 +265,14 @@ void __init fdt_scan_reserved_mem_late(void) return; } - /* Attempt dynamic allocation of a new reserved_mem array */ - alloc_reserved_mem_array(); - if (__reserved_mem_check_root(node)) { pr_err("Reserved memory: unsupported node format, ignoring\n"); return; } + /* Attempt dynamic allocation of a new reserved_mem array */ + alloc_reserved_mem_array(); + fdt_for_each_subnode(child, fdt, node) { const char *uname; u64 b, s; -- 2.43.0 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] of: reserved_mem: avoid unnecessary memory allocation when __reserved_mem_check_root() fails 2026-05-19 8:24 ` [PATCH v2 1/3] of: reserved_mem: avoid unnecessary memory allocation when __reserved_mem_check_root() fails Wandun Chen @ 2026-05-20 7:44 ` Krzysztof Kozlowski 2026-05-20 8:16 ` Wandun 0 siblings, 1 reply; 8+ messages in thread From: Krzysztof Kozlowski @ 2026-05-20 7:44 UTC (permalink / raw) To: Wandun Chen; +Cc: devicetree, linux-kernel, zhaomeijing, robh, saravanak On Tue, May 19, 2026 at 04:24:25PM +0800, Wandun Chen wrote: > total_reserved_mem_cnt will keep the init value (MAX_RESERVED_REGIONS) > in fdt_scan_reserved_mem() if __reserved_mem_check_root() fails. > > fdt_scan_reserved_mem_late() calls alloc_reserved_mem_array() to > allocate memory according to total_reserved_mem_cnt before > __reserved_mem_check_root(), so if __reserved_mem_check_root() fails, > the allocated array has nowhere to be used, so no need to allocate > memory. > > Move alloc_reserved_mem_array() after __reserved_mem_check_root() to > avoid potential memory waste. > > Signed-off-by: Wandun Chen <chenwandun@lixiang.com> Authorship/DCO mismatch. > Tested-by: Meijing Zhao <zhaomeijing@lixiang.com> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] of: reserved_mem: avoid unnecessary memory allocation when __reserved_mem_check_root() fails 2026-05-20 7:44 ` Krzysztof Kozlowski @ 2026-05-20 8:16 ` Wandun 2026-06-01 23:06 ` Rob Herring 0 siblings, 1 reply; 8+ messages in thread From: Wandun @ 2026-05-20 8:16 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: devicetree, linux-kernel, zhaomeijing, robh, saravanak On 5/20/26 15:44, Krzysztof Kozlowski wrote: > On Tue, May 19, 2026 at 04:24:25PM +0800, Wandun Chen wrote: >> total_reserved_mem_cnt will keep the init value (MAX_RESERVED_REGIONS) >> in fdt_scan_reserved_mem() if __reserved_mem_check_root() fails. >> >> fdt_scan_reserved_mem_late() calls alloc_reserved_mem_array() to >> allocate memory according to total_reserved_mem_cnt before >> __reserved_mem_check_root(), so if __reserved_mem_check_root() fails, >> the allocated array has nowhere to be used, so no need to allocate >> memory. >> >> Move alloc_reserved_mem_array() after __reserved_mem_check_root() to >> avoid potential memory waste. >> >> Signed-off-by: Wandun Chen <chenwandun@lixiang.com> > Authorship/DCO mismatch. Hi Krzysztof, Thanks for your review. Sorry for the mismatch. Dueto my company email server's issues with community mailing lists, I sent the patch via my personal email. I will add the correct 'From:' header and send a v3 patch shortly. Best regards, Wandun >> Tested-by: Meijing Zhao <zhaomeijing@lixiang.com> > Best regards, > Krzysztof > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] of: reserved_mem: avoid unnecessary memory allocation when __reserved_mem_check_root() fails 2026-05-20 8:16 ` Wandun @ 2026-06-01 23:06 ` Rob Herring 2026-06-02 1:37 ` Wandun 0 siblings, 1 reply; 8+ messages in thread From: Rob Herring @ 2026-06-01 23:06 UTC (permalink / raw) To: Wandun Cc: Krzysztof Kozlowski, devicetree, linux-kernel, zhaomeijing, saravanak On Wed, May 20, 2026 at 04:16:23PM +0800, Wandun wrote: > > > On 5/20/26 15:44, Krzysztof Kozlowski wrote: > > On Tue, May 19, 2026 at 04:24:25PM +0800, Wandun Chen wrote: > > > total_reserved_mem_cnt will keep the init value (MAX_RESERVED_REGIONS) > > > in fdt_scan_reserved_mem() if __reserved_mem_check_root() fails. > > > > > > fdt_scan_reserved_mem_late() calls alloc_reserved_mem_array() to > > > allocate memory according to total_reserved_mem_cnt before > > > __reserved_mem_check_root(), so if __reserved_mem_check_root() fails, > > > the allocated array has nowhere to be used, so no need to allocate > > > memory. > > > > > > Move alloc_reserved_mem_array() after __reserved_mem_check_root() to > > > avoid potential memory waste. > > > > > > Signed-off-by: Wandun Chen <chenwandun@lixiang.com> > > Authorship/DCO mismatch. > Hi Krzysztof, > > Thanks for your review. > Sorry for the mismatch. Dueto my company email server's issues with > community mailing lists, I sent the patch via my personal email. > I will add the correct 'From:' header and send a v3 patch shortly. There is also the 'b4 relay' that can be used for this kind of issue. Rob ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/3] of: reserved_mem: avoid unnecessary memory allocation when __reserved_mem_check_root() fails 2026-06-01 23:06 ` Rob Herring @ 2026-06-02 1:37 ` Wandun 0 siblings, 0 replies; 8+ messages in thread From: Wandun @ 2026-06-02 1:37 UTC (permalink / raw) To: Rob Herring Cc: Krzysztof Kozlowski, devicetree, linux-kernel, zhaomeijing, saravanak On 6/2/26 07:06, Rob Herring wrote: > On Wed, May 20, 2026 at 04:16:23PM +0800, Wandun wrote: >> >> On 5/20/26 15:44, Krzysztof Kozlowski wrote: >>> On Tue, May 19, 2026 at 04:24:25PM +0800, Wandun Chen wrote: >>>> total_reserved_mem_cnt will keep the init value (MAX_RESERVED_REGIONS) >>>> in fdt_scan_reserved_mem() if __reserved_mem_check_root() fails. >>>> >>>> fdt_scan_reserved_mem_late() calls alloc_reserved_mem_array() to >>>> allocate memory according to total_reserved_mem_cnt before >>>> __reserved_mem_check_root(), so if __reserved_mem_check_root() fails, >>>> the allocated array has nowhere to be used, so no need to allocate >>>> memory. >>>> >>>> Move alloc_reserved_mem_array() after __reserved_mem_check_root() to >>>> avoid potential memory waste. >>>> >>>> Signed-off-by: Wandun Chen <chenwandun@lixiang.com> >>> Authorship/DCO mismatch. >> Hi Krzysztof, >> >> Thanks for your review. >> Sorry for the mismatch. Dueto my company email server's issues with >> community mailing lists, I sent the patch via my personal email. >> I will add the correct 'From:' header and send a v3 patch shortly. > There is also the 'b4 relay' that can be used for this kind of issue. I wasn't aware of 'b4 relay' before, this is really helpful. Thanks for the tip! Best regards, Wandun > > Rob ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 2/3] of: reserved_mem: clean up redundant alloc_reserved_mem_array() call 2026-05-19 8:24 [PATCH v2 0/3] of: reserved_mem: fixes and cleanups Wandun Chen 2026-05-19 8:24 ` [PATCH v2 1/3] of: reserved_mem: avoid unnecessary memory allocation when __reserved_mem_check_root() fails Wandun Chen @ 2026-05-19 8:24 ` Wandun Chen 2026-05-19 8:24 ` [PATCH v2 3/3] of: reserved_mem: only support one <base size> entry in reg property Wandun Chen 2 siblings, 0 replies; 8+ messages in thread From: Wandun Chen @ 2026-05-19 8:24 UTC (permalink / raw) To: devicetree, linux-kernel, zhaomeijing; +Cc: robh, saravanak If total_reserved_mem_cnt is 0 after fdt_scan_reserved_mem(), there is no entry to save, alloc_reserved_mem_array() has nothing to do. Just skip it. Signed-off-by: Wandun Chen <chenwandun@lixiang.com> --- drivers/of/of_reserved_mem.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 7856dc857d65..462e7c3078a3 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -270,6 +270,9 @@ void __init fdt_scan_reserved_mem_late(void) return; } + if (!total_reserved_mem_cnt) + return; + /* Attempt dynamic allocation of a new reserved_mem array */ alloc_reserved_mem_array(); -- 2.43.0 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 3/3] of: reserved_mem: only support one <base size> entry in reg property 2026-05-19 8:24 [PATCH v2 0/3] of: reserved_mem: fixes and cleanups Wandun Chen 2026-05-19 8:24 ` [PATCH v2 1/3] of: reserved_mem: avoid unnecessary memory allocation when __reserved_mem_check_root() fails Wandun Chen 2026-05-19 8:24 ` [PATCH v2 2/3] of: reserved_mem: clean up redundant alloc_reserved_mem_array() call Wandun Chen @ 2026-05-19 8:24 ` Wandun Chen 2 siblings, 0 replies; 8+ messages in thread From: Wandun Chen @ 2026-05-19 8:24 UTC (permalink / raw) To: devicetree, linux-kernel, zhaomeijing; +Cc: robh, saravanak A /reserved-memory child node may have multiple <base size> tuples in 'reg' property, but multiple entries in 'reg' have never been fully functional: - fdt_scan_reserved_mem() in the early pass loops over every tuple and reserves them all. - fdt_scan_reserved_mem_late() reads 'reg' by of_flat_dt_get_addr_size(), which returns false if entries != 1. So 'reg' property with multiple <base size> entries will be skipped, no reserved_mem entry is created in reserved_mem[]. Supporting multiple <base size> tuples is not a good idea: - It requires reserved_mem_ops->node_init support. Currently, CMA(rmem_cma_setup) and DMA(rmem_dma_setup) are not supported. - of_reserved_mem_lookup() is name-based, only the first entry in multiple <base size> tuples will be found. So change to support one <base size> entry in 'reg' property. Also update dt binding: https://github.com/devicetree-org/dt-schema/pull/197 Suggested-by: Rob Herring <robh@kernel.org> Signed-off-by: Wandun Chen <chenwandun@lixiang.com> Tested-by: Meijing Zhao <zhaomeijing@lixiang.com> Link: https://lore.kernel.org/all/20260506014752.GA280279-robh@kernel.org/ --- drivers/of/of_reserved_mem.c | 39 ++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 462e7c3078a3..0e91c4a71d89 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -134,37 +134,38 @@ static int __init __reserved_mem_reserve_reg(unsigned long node, const char *uname) { phys_addr_t base, size; - int i, len, err; + int len, err; const __be32 *prop; bool nomap; + u64 b, s; prop = of_flat_dt_get_addr_size_prop(node, "reg", &len); if (!prop) return -ENOENT; + if (len > 1) + pr_warn("Reserved memory: node '%s' has %d <base size> entries, only the first is used\n", + uname, len); + nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; err = fdt_validate_reserved_mem_node(node, NULL); if (err && err != -ENODEV) return err; - for (i = 0; i < len; i++) { - u64 b, s; - - of_flat_dt_read_addr_size(prop, i, &b, &s); - - base = b; - size = s; + of_flat_dt_read_addr_size(prop, 0, &b, &s); + base = b; + size = s; - if (size && early_init_dt_reserve_memory(base, size, nomap) == 0) { - fdt_fixup_reserved_mem_node(node, base, size); - pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n", - uname, &base, (unsigned long)(size / SZ_1M)); - } else { - pr_err("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n", - uname, &base, (unsigned long)(size / SZ_1M)); - } + if (size && early_init_dt_reserve_memory(base, size, nomap) == 0) { + fdt_fixup_reserved_mem_node(node, base, size); + pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n", + uname, &base, (unsigned long)(size / SZ_1M)); + } else { + pr_err("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n", + uname, &base, (unsigned long)(size / SZ_1M)); } + return 0; } @@ -277,20 +278,24 @@ void __init fdt_scan_reserved_mem_late(void) alloc_reserved_mem_array(); fdt_for_each_subnode(child, fdt, node) { + const __be32 *prop; const char *uname; u64 b, s; int ret; + int len; if (!of_fdt_device_is_available(fdt, child)) continue; - if (!of_flat_dt_get_addr_size(child, "reg", &b, &s)) + prop = of_flat_dt_get_addr_size_prop(child, "reg", &len); + if (!prop) continue; ret = fdt_validate_reserved_mem_node(child, NULL); if (ret && ret != -ENODEV) continue; + of_flat_dt_read_addr_size(prop, 0, &b, &s); base = b; size = s; -- 2.43.0 ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-06-02 1:37 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-05-19 8:24 [PATCH v2 0/3] of: reserved_mem: fixes and cleanups Wandun Chen 2026-05-19 8:24 ` [PATCH v2 1/3] of: reserved_mem: avoid unnecessary memory allocation when __reserved_mem_check_root() fails Wandun Chen 2026-05-20 7:44 ` Krzysztof Kozlowski 2026-05-20 8:16 ` Wandun 2026-06-01 23:06 ` Rob Herring 2026-06-02 1:37 ` Wandun 2026-05-19 8:24 ` [PATCH v2 2/3] of: reserved_mem: clean up redundant alloc_reserved_mem_array() call Wandun Chen 2026-05-19 8:24 ` [PATCH v2 3/3] of: reserved_mem: only support one <base size> entry in reg property Wandun Chen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
Powered by JetHome