* [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param @ 2025-12-10 0:20 ` Oreoluwa Babatunde 2025-12-10 14:07 ` Rob Herring ` (4 more replies) 0 siblings, 5 replies; 8+ messages in thread From: Oreoluwa Babatunde @ 2025-12-10 0:20 UTC (permalink / raw) To: robh, m.szyprowski, ye.li Cc: oreoluwa.babatunde, kernel, saravanak, akpm, david, lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, robin.murphy, devicetree, linux-kernel, linux-mm, iommu, quic_c_gdjako When initializing the default cma region, the "cma=" kernel parameter takes priority over a DT defined linux,cma-default region. Hence, give the reserved_mem framework the ability to detect this so that the DT defined cma region can skip initialization accordingly. Signed-off-by: Oreoluwa Babatunde <oreoluwa.babatunde@oss.qualcomm.com> --- drivers/of/of_reserved_mem.c | 19 +++++++++++++++++-- include/linux/cma.h | 1 + kernel/dma/contiguous.c | 16 ++++++++++------ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 2e9ea751ed2d..bef68a4916b5 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -158,7 +158,7 @@ static int __init __reserved_mem_reserve_reg(unsigned long node, phys_addr_t base, size; int len; const __be32 *prop; - bool nomap; + bool nomap, default_cma; prop = of_get_flat_dt_prop(node, "reg", &len); if (!prop) @@ -171,6 +171,12 @@ static int __init __reserved_mem_reserve_reg(unsigned long node, } nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; + default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL); + + if (default_cma && cma_skip_dt_default_reserved_mem()) { + pr_err("Skipping dt linux,cma-default for \"cma=\" kernel param.\n"); + return -EINVAL; + } while (len >= t_len) { base = dt_mem_next_cell(dt_root_addr_cells, &prop); @@ -256,12 +262,15 @@ void __init fdt_scan_reserved_mem_reg_nodes(void) fdt_for_each_subnode(child, fdt, node) { const char *uname; + bool default_cma = of_get_flat_dt_prop(child, "linux,cma-default", NULL); prop = of_get_flat_dt_prop(child, "reg", &len); if (!prop) continue; if (!of_fdt_device_is_available(fdt, child)) continue; + if (default_cma && cma_skip_dt_default_reserved_mem()) + continue; uname = fdt_get_name(fdt, child, NULL); if (len && len % t_len != 0) { @@ -406,7 +415,7 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam phys_addr_t base = 0, align = 0, size; int len; const __be32 *prop; - bool nomap; + bool nomap, default_cma; int ret; prop = of_get_flat_dt_prop(node, "size", &len); @@ -430,6 +439,12 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam } nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; + default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL); + + if (default_cma && cma_skip_dt_default_reserved_mem()) { + pr_err("Skipping dt linux,cma-default for \"cma=\" kernel param.\n"); + return -EINVAL; + } /* Need adjust the alignment to satisfy the CMA requirement */ if (IS_ENABLED(CONFIG_CMA) diff --git a/include/linux/cma.h b/include/linux/cma.h index 62d9c1cf6326..3d3047029950 100644 --- a/include/linux/cma.h +++ b/include/linux/cma.h @@ -47,6 +47,7 @@ extern int cma_init_reserved_mem(phys_addr_t base, phys_addr_t size, unsigned int order_per_bit, const char *name, struct cma **res_cma); +extern bool cma_skip_dt_default_reserved_mem(void); extern struct page *cma_alloc(struct cma *cma, unsigned long count, unsigned int align, bool no_warn); extern bool cma_pages_valid(struct cma *cma, const struct page *pages, unsigned long count); diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c index d9b9dcba6ff7..9071c08650e3 100644 --- a/kernel/dma/contiguous.c +++ b/kernel/dma/contiguous.c @@ -90,6 +90,16 @@ static int __init early_cma(char *p) } early_param("cma", early_cma); +/* + * cma_skip_dt_default_reserved_mem - This is called from the + * reserved_mem framework to detect if the default cma region is being + * set by the "cma=" kernel parameter. + */ +bool __init cma_skip_dt_default_reserved_mem(void) +{ + return size_cmdline != -1; +} + #ifdef CONFIG_DMA_NUMA_CMA static struct cma *dma_contiguous_numa_area[MAX_NUMNODES]; @@ -463,12 +473,6 @@ static int __init rmem_cma_setup(struct reserved_mem *rmem) struct cma *cma; int err; - if (size_cmdline != -1 && default_cma) { - pr_info("Reserved memory: bypass %s node, using cmdline CMA params instead\n", - rmem->name); - return -EBUSY; - } - if (!of_get_flat_dt_prop(node, "reusable", NULL) || of_get_flat_dt_prop(node, "no-map", NULL)) return -EINVAL; -- 2.34.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param 2025-12-10 0:20 ` [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param Oreoluwa Babatunde @ 2025-12-10 14:07 ` Rob Herring 2025-12-16 22:21 ` Oreoluwa Babatunde 2025-12-12 11:19 ` kernel test robot ` (3 subsequent siblings) 4 siblings, 1 reply; 8+ messages in thread From: Rob Herring @ 2025-12-10 14:07 UTC (permalink / raw) To: Oreoluwa Babatunde Cc: m.szyprowski, ye.li, kernel, saravanak, akpm, david, lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, robin.murphy, devicetree, linux-kernel, linux-mm, iommu, quic_c_gdjako On Tue, Dec 9, 2025 at 6:20 PM Oreoluwa Babatunde <oreoluwa.babatunde@oss.qualcomm.com> wrote: > > When initializing the default cma region, the "cma=" kernel parameter > takes priority over a DT defined linux,cma-default region. Hence, give > the reserved_mem framework the ability to detect this so that the DT > defined cma region can skip initialization accordingly. Please explain here why this is a new problem. Presumably the RESERVEDMEM_OF_DECLARE hook after commit xxxx gets called before the early_param hook. And why is it now earlier? I don't really like the state/ordering having to be worried about in 2 places. > Signed-off-by: Oreoluwa Babatunde <oreoluwa.babatunde@oss.qualcomm.com> > --- > drivers/of/of_reserved_mem.c | 19 +++++++++++++++++-- > include/linux/cma.h | 1 + > kernel/dma/contiguous.c | 16 ++++++++++------ > 3 files changed, 28 insertions(+), 8 deletions(-) > > diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c > index 2e9ea751ed2d..bef68a4916b5 100644 > --- a/drivers/of/of_reserved_mem.c > +++ b/drivers/of/of_reserved_mem.c > @@ -158,7 +158,7 @@ static int __init __reserved_mem_reserve_reg(unsigned long node, > phys_addr_t base, size; > int len; > const __be32 *prop; > - bool nomap; > + bool nomap, default_cma; > > prop = of_get_flat_dt_prop(node, "reg", &len); > if (!prop) > @@ -171,6 +171,12 @@ static int __init __reserved_mem_reserve_reg(unsigned long node, > } > > nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; > + default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL); > + > + if (default_cma && cma_skip_dt_default_reserved_mem()) { > + pr_err("Skipping dt linux,cma-default for \"cma=\" kernel param.\n"); > + return -EINVAL; > + } > > while (len >= t_len) { > base = dt_mem_next_cell(dt_root_addr_cells, &prop); > @@ -256,12 +262,15 @@ void __init fdt_scan_reserved_mem_reg_nodes(void) > > fdt_for_each_subnode(child, fdt, node) { > const char *uname; > + bool default_cma = of_get_flat_dt_prop(child, "linux,cma-default", NULL); > > prop = of_get_flat_dt_prop(child, "reg", &len); > if (!prop) > continue; > if (!of_fdt_device_is_available(fdt, child)) > continue; > + if (default_cma && cma_skip_dt_default_reserved_mem()) > + continue; > > uname = fdt_get_name(fdt, child, NULL); > if (len && len % t_len != 0) { > @@ -406,7 +415,7 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam > phys_addr_t base = 0, align = 0, size; > int len; > const __be32 *prop; > - bool nomap; > + bool nomap, default_cma; > int ret; > > prop = of_get_flat_dt_prop(node, "size", &len); > @@ -430,6 +439,12 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam > } > > nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; > + default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL); > + > + if (default_cma && cma_skip_dt_default_reserved_mem()) { > + pr_err("Skipping dt linux,cma-default for \"cma=\" kernel param.\n"); > + return -EINVAL; > + } > > /* Need adjust the alignment to satisfy the CMA requirement */ > if (IS_ENABLED(CONFIG_CMA) > diff --git a/include/linux/cma.h b/include/linux/cma.h > index 62d9c1cf6326..3d3047029950 100644 > --- a/include/linux/cma.h > +++ b/include/linux/cma.h > @@ -47,6 +47,7 @@ extern int cma_init_reserved_mem(phys_addr_t base, phys_addr_t size, > unsigned int order_per_bit, > const char *name, > struct cma **res_cma); > +extern bool cma_skip_dt_default_reserved_mem(void); > extern struct page *cma_alloc(struct cma *cma, unsigned long count, unsigned int align, > bool no_warn); > extern bool cma_pages_valid(struct cma *cma, const struct page *pages, unsigned long count); > diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c > index d9b9dcba6ff7..9071c08650e3 100644 > --- a/kernel/dma/contiguous.c > +++ b/kernel/dma/contiguous.c > @@ -90,6 +90,16 @@ static int __init early_cma(char *p) > } > early_param("cma", early_cma); > > +/* > + * cma_skip_dt_default_reserved_mem - This is called from the > + * reserved_mem framework to detect if the default cma region is being > + * set by the "cma=" kernel parameter. > + */ > +bool __init cma_skip_dt_default_reserved_mem(void) > +{ > + return size_cmdline != -1; > +} > + > #ifdef CONFIG_DMA_NUMA_CMA > > static struct cma *dma_contiguous_numa_area[MAX_NUMNODES]; > @@ -463,12 +473,6 @@ static int __init rmem_cma_setup(struct reserved_mem *rmem) > struct cma *cma; > int err; > > - if (size_cmdline != -1 && default_cma) { > - pr_info("Reserved memory: bypass %s node, using cmdline CMA params instead\n", > - rmem->name); > - return -EBUSY; > - } > - > if (!of_get_flat_dt_prop(node, "reusable", NULL) || > of_get_flat_dt_prop(node, "no-map", NULL)) > return -EINVAL; > -- > 2.34.1 > > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param 2025-12-10 14:07 ` Rob Herring @ 2025-12-16 22:21 ` Oreoluwa Babatunde 0 siblings, 0 replies; 8+ messages in thread From: Oreoluwa Babatunde @ 2025-12-16 22:21 UTC (permalink / raw) To: Rob Herring Cc: m.szyprowski, ye.li, kernel, saravanak, akpm, david, lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, robin.murphy, devicetree, linux-kernel, linux-mm, iommu, quic_c_gdjako Hi Rob, On 12/10/2025 6:07 AM, Rob Herring wrote: > On Tue, Dec 9, 2025 at 6:20 PM Oreoluwa Babatunde > <oreoluwa.babatunde@oss.qualcomm.com> wrote: >> >> When initializing the default cma region, the "cma=" kernel parameter >> takes priority over a DT defined linux,cma-default region. Hence, give >> the reserved_mem framework the ability to detect this so that the DT >> defined cma region can skip initialization accordingly. > > Please explain here why this is a new problem. Presumably the > RESERVEDMEM_OF_DECLARE hook after commit xxxx gets called before the > early_param hook. And why is it now earlier? ACK. I will add more of this info in the next patch version. > > I don't really like the state/ordering having to be worried about in 2 places. The advantage to having the state visible to the reserved_mem code is that we can skip adding the DT node to the resrved_mem array since it actually won't be used. If this is still not preferred, another option would be to use a helper function in contiguous.c to call dma_contiguous_early_fixup() for the reserved_mem code. This way, "size_cmdline" can be checked internally within the file and it can call dma_contiguous_early_fixup based on that. > >> Signed-off-by: Oreoluwa Babatunde <oreoluwa.babatunde@oss.qualcomm.com> >> --- >> drivers/of/of_reserved_mem.c | 19 +++++++++++++++++-- >> include/linux/cma.h | 1 + >> kernel/dma/contiguous.c | 16 ++++++++++------ >> 3 files changed, 28 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c >> index 2e9ea751ed2d..bef68a4916b5 100644 >> --- a/drivers/of/of_reserved_mem.c >> +++ b/drivers/of/of_reserved_mem.c >> @@ -158,7 +158,7 @@ static int __init __reserved_mem_reserve_reg(unsigned long node, >> phys_addr_t base, size; >> int len; >> const __be32 *prop; >> - bool nomap; >> + bool nomap, default_cma; >> >> prop = of_get_flat_dt_prop(node, "reg", &len); >> if (!prop) >> @@ -171,6 +171,12 @@ static int __init __reserved_mem_reserve_reg(unsigned long node, >> } >> >> nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; >> + default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL); >> + >> + if (default_cma && cma_skip_dt_default_reserved_mem()) { >> + pr_err("Skipping dt linux,cma-default for \"cma=\" kernel param.\n"); >> + return -EINVAL; >> + } >> >> while (len >= t_len) { >> base = dt_mem_next_cell(dt_root_addr_cells, &prop); >> @@ -256,12 +262,15 @@ void __init fdt_scan_reserved_mem_reg_nodes(void) >> >> fdt_for_each_subnode(child, fdt, node) { >> const char *uname; >> + bool default_cma = of_get_flat_dt_prop(child, "linux,cma-default", NULL); >> >> prop = of_get_flat_dt_prop(child, "reg", &len); >> if (!prop) >> continue; >> if (!of_fdt_device_is_available(fdt, child)) >> continue; >> + if (default_cma && cma_skip_dt_default_reserved_mem()) >> + continue; >> >> uname = fdt_get_name(fdt, child, NULL); >> if (len && len % t_len != 0) { >> @@ -406,7 +415,7 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam >> phys_addr_t base = 0, align = 0, size; >> int len; >> const __be32 *prop; >> - bool nomap; >> + bool nomap, default_cma; >> int ret; >> >> prop = of_get_flat_dt_prop(node, "size", &len); >> @@ -430,6 +439,12 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam >> } >> >> nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; >> + default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL); >> + >> + if (default_cma && cma_skip_dt_default_reserved_mem()) { >> + pr_err("Skipping dt linux,cma-default for \"cma=\" kernel param.\n"); >> + return -EINVAL; >> + } >> >> /* Need adjust the alignment to satisfy the CMA requirement */ >> if (IS_ENABLED(CONFIG_CMA) >> diff --git a/include/linux/cma.h b/include/linux/cma.h >> index 62d9c1cf6326..3d3047029950 100644 >> --- a/include/linux/cma.h >> +++ b/include/linux/cma.h >> @@ -47,6 +47,7 @@ extern int cma_init_reserved_mem(phys_addr_t base, phys_addr_t size, >> unsigned int order_per_bit, >> const char *name, >> struct cma **res_cma); >> +extern bool cma_skip_dt_default_reserved_mem(void); >> extern struct page *cma_alloc(struct cma *cma, unsigned long count, unsigned int align, >> bool no_warn); >> extern bool cma_pages_valid(struct cma *cma, const struct page *pages, unsigned long count); >> diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c >> index d9b9dcba6ff7..9071c08650e3 100644 >> --- a/kernel/dma/contiguous.c >> +++ b/kernel/dma/contiguous.c >> @@ -90,6 +90,16 @@ static int __init early_cma(char *p) >> } >> early_param("cma", early_cma); >> >> +/* >> + * cma_skip_dt_default_reserved_mem - This is called from the >> + * reserved_mem framework to detect if the default cma region is being >> + * set by the "cma=" kernel parameter. >> + */ >> +bool __init cma_skip_dt_default_reserved_mem(void) >> +{ >> + return size_cmdline != -1; >> +} >> + >> #ifdef CONFIG_DMA_NUMA_CMA >> >> static struct cma *dma_contiguous_numa_area[MAX_NUMNODES]; >> @@ -463,12 +473,6 @@ static int __init rmem_cma_setup(struct reserved_mem *rmem) >> struct cma *cma; >> int err; >> >> - if (size_cmdline != -1 && default_cma) { >> - pr_info("Reserved memory: bypass %s node, using cmdline CMA params instead\n", >> - rmem->name); >> - return -EBUSY; >> - } >> - >> if (!of_get_flat_dt_prop(node, "reusable", NULL) || >> of_get_flat_dt_prop(node, "no-map", NULL)) >> return -EINVAL; >> -- >> 2.34.1 >> >> Regards, Oreoluwa ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param 2025-12-10 0:20 ` [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param Oreoluwa Babatunde 2025-12-10 14:07 ` Rob Herring @ 2025-12-12 11:19 ` kernel test robot 2025-12-12 11:19 ` kernel test robot ` (2 subsequent siblings) 4 siblings, 0 replies; 8+ messages in thread From: kernel test robot @ 2025-12-12 11:19 UTC (permalink / raw) To: Oreoluwa Babatunde, robh, m.szyprowski, ye.li Cc: oe-kbuild-all, oreoluwa.babatunde, kernel, saravanak, akpm, david, lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, robin.murphy, devicetree, linux-kernel, linux-mm, iommu, quic_c_gdjako Hi Oreoluwa, kernel test robot noticed the following build errors: [auto build test ERROR on akpm-mm/mm-everything] [also build test ERROR on v6.18] [cannot apply to robh/for-next linus/master next-20251212] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Oreoluwa-Babatunde/of-reserved_mem-Allow-reserved_mem-framework-detect-cma-kernel-param/20251210-082127 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20251210002027.1171519-1-oreoluwa.babatunde%40oss.qualcomm.com patch subject: [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param config: arc-randconfig-001-20251212 (https://download.01.org/0day-ci/archive/20251212/202512121907.gdTOodx3-lkp@intel.com/config) compiler: arc-linux-gcc (GCC) 8.5.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251212/202512121907.gdTOodx3-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202512121907.gdTOodx3-lkp@intel.com/ All errors (new ones prefixed by >>): arc-linux-ld: drivers/of/of_reserved_mem.o: in function `fdt_scan_reserved_mem_reg_nodes': >> of_reserved_mem.c:(.init.text+0x46e): undefined reference to `cma_skip_dt_default_reserved_mem' >> arc-linux-ld: of_reserved_mem.c:(.init.text+0x46e): undefined reference to `cma_skip_dt_default_reserved_mem' arc-linux-ld: drivers/of/of_reserved_mem.o: in function `fdt_scan_reserved_mem': of_reserved_mem.c:(.init.text+0x618): undefined reference to `cma_skip_dt_default_reserved_mem' arc-linux-ld: of_reserved_mem.c:(.init.text+0x618): undefined reference to `cma_skip_dt_default_reserved_mem' arc-linux-ld: of_reserved_mem.c:(.init.text+0x77c): undefined reference to `cma_skip_dt_default_reserved_mem' arc-linux-ld: drivers/of/of_reserved_mem.o:of_reserved_mem.c:(.init.text+0x77c): more undefined references to `cma_skip_dt_default_reserved_mem' follow -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param 2025-12-10 0:20 ` [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param Oreoluwa Babatunde 2025-12-10 14:07 ` Rob Herring 2025-12-12 11:19 ` kernel test robot @ 2025-12-12 11:19 ` kernel test robot 2025-12-16 3:09 ` Joy Zou [not found] ` <X-TH#1.CAL_JsqL6VVQ7K_ZAbHJ8Gb7ei_jusLx6wRn=AdOVgV50dX0ejQ@mail.gmail.com> 4 siblings, 0 replies; 8+ messages in thread From: kernel test robot @ 2025-12-12 11:19 UTC (permalink / raw) To: Oreoluwa Babatunde, robh, m.szyprowski, ye.li Cc: oe-kbuild-all, oreoluwa.babatunde, kernel, saravanak, akpm, david, lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, robin.murphy, devicetree, linux-kernel, linux-mm, iommu, quic_c_gdjako Hi Oreoluwa, kernel test robot noticed the following build errors: [auto build test ERROR on akpm-mm/mm-everything] [also build test ERROR on v6.18] [cannot apply to robh/for-next linus/master next-20251212] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Oreoluwa-Babatunde/of-reserved_mem-Allow-reserved_mem-framework-detect-cma-kernel-param/20251210-082127 base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything patch link: https://lore.kernel.org/r/20251210002027.1171519-1-oreoluwa.babatunde%40oss.qualcomm.com patch subject: [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param config: nios2-randconfig-r073-20251212 (https://download.01.org/0day-ci/archive/20251212/202512121807.G5FMUgvU-lkp@intel.com/config) compiler: nios2-linux-gcc (GCC) 10.5.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251212/202512121807.G5FMUgvU-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202512121807.G5FMUgvU-lkp@intel.com/ All errors (new ones prefixed by >>): nios2-linux-ld: drivers/of/of_reserved_mem.o: in function `__reserved_mem_reserve_reg': >> drivers/of/of_reserved_mem.c:176: undefined reference to `cma_skip_dt_default_reserved_mem' >> drivers/of/of_reserved_mem.c:176:(.init.text+0x5b8): relocation truncated to fit: R_NIOS2_CALL26 against `cma_skip_dt_default_reserved_mem' nios2-linux-ld: drivers/of/of_reserved_mem.o: in function `__reserved_mem_alloc_size': drivers/of/of_reserved_mem.c:444: undefined reference to `cma_skip_dt_default_reserved_mem' drivers/of/of_reserved_mem.c:444:(.init.text+0x8a4): relocation truncated to fit: R_NIOS2_CALL26 against `cma_skip_dt_default_reserved_mem' nios2-linux-ld: drivers/of/of_reserved_mem.o: in function `fdt_scan_reserved_mem_reg_nodes': drivers/of/of_reserved_mem.c:272: undefined reference to `cma_skip_dt_default_reserved_mem' drivers/of/of_reserved_mem.c:272:(.init.text+0xbb0): relocation truncated to fit: R_NIOS2_CALL26 against `cma_skip_dt_default_reserved_mem' vim +176 drivers/of/of_reserved_mem.c 150 151 /* 152 * __reserved_mem_reserve_reg() - reserve all memory described in 'reg' property 153 */ 154 static int __init __reserved_mem_reserve_reg(unsigned long node, 155 const char *uname) 156 { 157 int t_len = (dt_root_addr_cells + dt_root_size_cells) * sizeof(__be32); 158 phys_addr_t base, size; 159 int len; 160 const __be32 *prop; 161 bool nomap, default_cma; 162 163 prop = of_get_flat_dt_prop(node, "reg", &len); 164 if (!prop) 165 return -ENOENT; 166 167 if (len && len % t_len != 0) { 168 pr_err("Reserved memory: invalid reg property in '%s', skipping node.\n", 169 uname); 170 return -EINVAL; 171 } 172 173 nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL; 174 default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL); 175 > 176 if (default_cma && cma_skip_dt_default_reserved_mem()) { 177 pr_err("Skipping dt linux,cma-default for \"cma=\" kernel param.\n"); 178 return -EINVAL; 179 } 180 181 while (len >= t_len) { 182 base = dt_mem_next_cell(dt_root_addr_cells, &prop); 183 size = dt_mem_next_cell(dt_root_size_cells, &prop); 184 185 if (size && early_init_dt_reserve_memory(base, size, nomap) == 0) { 186 /* Architecture specific contiguous memory fixup. */ 187 if (of_flat_dt_is_compatible(node, "shared-dma-pool") && 188 of_get_flat_dt_prop(node, "reusable", NULL)) 189 dma_contiguous_early_fixup(base, size); 190 pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n", 191 uname, &base, (unsigned long)(size / SZ_1M)); 192 } else { 193 pr_err("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n", 194 uname, &base, (unsigned long)(size / SZ_1M)); 195 } 196 197 len -= t_len; 198 } 199 return 0; 200 } 201 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param 2025-12-10 0:20 ` [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param Oreoluwa Babatunde ` (2 preceding siblings ...) 2025-12-12 11:19 ` kernel test robot @ 2025-12-16 3:09 ` Joy Zou [not found] ` <X-TH#1.CAL_JsqL6VVQ7K_ZAbHJ8Gb7ei_jusLx6wRn=AdOVgV50dX0ejQ@mail.gmail.com> 4 siblings, 0 replies; 8+ messages in thread From: Joy Zou @ 2025-12-16 3:09 UTC (permalink / raw) To: Oreoluwa Babatunde Cc: robh, m.szyprowski, ye.li, oreoluwa.babatunde, kernel, saravanak, akpm, david, lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, robin.murphy, devicetree, linux-kernel, linux-mm, iommu, quic_c_gdjako On Tue, Dec 09, 2025 at 04:20:27PM -0800, Oreoluwa Babatunde wrote: > When initializing the default cma region, the "cma=" kernel parameter > takes priority over a DT defined linux,cma-default region. Hence, give > the reserved_mem framework the ability to detect this so that the DT > defined cma region can skip initialization accordingly. > Hi Oreoluwa, Have tested i.MX6ULL 9x9, i.MX6ULL 14x14, i.MX6SLL EVK and i.MX7D SABRE-SD boards. Before this patch, i.MX6ULL 9x9 failed to allocate CMA memory when using "cma=" kernel parameter. After applying the patch, CMA allocation works correctly on all tested platforms. Tested-by: Joy Zou <joy.zou@nxp.com> BR Joy Zou > Signed-off-by: Oreoluwa Babatunde <oreoluwa.babatunde@oss.qualcomm.com> > --- > drivers/of/of_reserved_mem.c | 19 +++++++++++++++++-- > include/linux/cma.h | 1 + > kernel/dma/contiguous.c | 16 ++++++++++------ > 3 files changed, 28 insertions(+), 8 deletions(-) > 2.34.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <X-TH#1.CAL_JsqL6VVQ7K_ZAbHJ8Gb7ei_jusLx6wRn=AdOVgV50dX0ejQ@mail.gmail.com>]
* Re: [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param [not found] ` <X-TH#1.CAL_JsqL6VVQ7K_ZAbHJ8Gb7ei_jusLx6wRn=AdOVgV50dX0ejQ@mail.gmail.com> @ 2025-12-18 9:55 ` Marek Szyprowski 2025-12-18 14:42 ` Rob Herring 0 siblings, 1 reply; 8+ messages in thread From: Marek Szyprowski @ 2025-12-18 9:55 UTC (permalink / raw) To: Rob Herring, Oreoluwa Babatunde Cc: ye.li, kernel, saravanak, akpm, david, lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, robin.murphy, devicetree, linux-kernel, linux-mm, iommu, quic_c_gdjako On 10.12.2025 15:07, Rob Herring wrote: > On Tue, Dec 9, 2025 at 6:20 PM Oreoluwa Babatunde > <oreoluwa.babatunde@oss.qualcomm.com> wrote: >> When initializing the default cma region, the "cma=" kernel parameter >> takes priority over a DT defined linux,cma-default region. Hence, give >> the reserved_mem framework the ability to detect this so that the DT >> defined cma region can skip initialization accordingly. > Please explain here why this is a new problem. Presumably the > RESERVEDMEM_OF_DECLARE hook after commit xxxx gets called before the > early_param hook. And why is it now earlier? > > I don't really like the state/ordering having to be worried about in 2 places. I also don't like this spaghetti, but it originates from commit 8a6e02d0c00e ("of: reserved_mem: Restructure how the reserved memory regions are processed") and the first fixup for it: 2c223f7239f3 ("of: reserved_mem: Restructure call site for dma_contiguous_early_fixup()"). It looks that it is really hard to make reserved memory initialization fully dynamic assuming that the cma related fixups have to be known before populating kernel memory pages tables. I also advised in https://lore.kernel.org/all/be70bdc4-bddd-4afe-8574-7e0889fd381c@samsung.com/ to simply increase the size of the static table to make it large enough for the sane use cases, but it turned out that this approach was already discussed and rejected: https://lore.kernel.org/all/1650488954-26662-1-git-send-email-quic_pdaly@quicinc.com/ Maybe it would make sense to revert the mentioned changes and get back to such simple approach - to make the size of the static table configurable in the Kconfig? Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param 2025-12-18 9:55 ` Marek Szyprowski @ 2025-12-18 14:42 ` Rob Herring 0 siblings, 0 replies; 8+ messages in thread From: Rob Herring @ 2025-12-18 14:42 UTC (permalink / raw) To: Marek Szyprowski Cc: Oreoluwa Babatunde, ye.li, kernel, saravanak, akpm, david, lorenzo.stoakes, Liam.Howlett, vbabka, rppt, surenb, mhocko, robin.murphy, devicetree, linux-kernel, linux-mm, iommu, quic_c_gdjako On Thu, Dec 18, 2025 at 3:55 AM Marek Szyprowski <m.szyprowski@samsung.com> wrote: > > On 10.12.2025 15:07, Rob Herring wrote: > > On Tue, Dec 9, 2025 at 6:20 PM Oreoluwa Babatunde > > <oreoluwa.babatunde@oss.qualcomm.com> wrote: > >> When initializing the default cma region, the "cma=" kernel parameter > >> takes priority over a DT defined linux,cma-default region. Hence, give > >> the reserved_mem framework the ability to detect this so that the DT > >> defined cma region can skip initialization accordingly. > > Please explain here why this is a new problem. Presumably the > > RESERVEDMEM_OF_DECLARE hook after commit xxxx gets called before the > > early_param hook. And why is it now earlier? > > > > I don't really like the state/ordering having to be worried about in 2 places. > > I also don't like this spaghetti, but it originates from > commit 8a6e02d0c00e ("of: reserved_mem: Restructure how the reserved > memory regions are processed") and the first fixup for it: 2c223f7239f3 > ("of: reserved_mem: Restructure call site for > dma_contiguous_early_fixup()"). Honestly, this code wasn't great before. Every time it is touched it breaks someone. > It looks that it is really hard to make reserved memory > initialization fully dynamic assuming that the cma related fixups have > to be known before populating kernel memory pages tables. I also advised > in > https://lore.kernel.org/all/be70bdc4-bddd-4afe-8574-7e0889fd381c@samsung.com/ > to simply increase the size of the static table to make it large enough for the sane use cases, but > it turned out that this approach was already discussed and rejected: > https://lore.kernel.org/all/1650488954-26662-1-git-send-email-quic_pdaly@quicinc.com/ I guess the question is what's a sane limit? After 128, are we going to accept 256? I really suspect we are just enabling some further abuse of /reserved-memory downstream. For example, I could imagine there's micromanaging the location of media/graphics buffers so they end up in specific DRAM banks to optimize accesses. No one ever wants to detail why they want/need more regions. > Maybe it would make sense to revert the mentioned changes and get back > to such simple approach - to make the size of the static table > configurable in the Kconfig? I'd rather not resort to a kconfig option. We could go back to processing all the regions at the beginning (growing the static size), and then just shrinking allocation. Or maybe it could just be freed entirely. I don't think we really need to keep the state around forever. Rob ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-12-18 14:43 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <CGME20251210002053eucas1p1d1408ad0fb49a49bf4371687f8df7395@eucas1p1.samsung.com>
2025-12-10 0:20 ` [PATCH] of: reserved_mem: Allow reserved_mem framework detect "cma=" kernel param Oreoluwa Babatunde
2025-12-10 14:07 ` Rob Herring
2025-12-16 22:21 ` Oreoluwa Babatunde
2025-12-12 11:19 ` kernel test robot
2025-12-12 11:19 ` kernel test robot
2025-12-16 3:09 ` Joy Zou
[not found] ` <X-TH#1.CAL_JsqL6VVQ7K_ZAbHJ8Gb7ei_jusLx6wRn=AdOVgV50dX0ejQ@mail.gmail.com>
2025-12-18 9:55 ` Marek Szyprowski
2025-12-18 14:42 ` Rob Herring
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox