mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2025-04-19 20:58:31 +09:00
mm/cma: report base address of single range correctly
The cma_declare_contiguous_nid code was refactored by commit c009da4258f9 ("mm, cma: support multiple contiguous ranges, if requested"), so that it could use an internal function to attempt a single range area first, and then try a multi-range one. However, that meant that the actual base address used for the !fixed case (base == 0) wasn't available one level up to be printed in the informational message, and it would always end up printing a base address of 0 in the boot message. Make the internal function take a phys_addr_t pointer to the base address, so that the value is available to the caller. [fvdl@google.com: v2] Link: https://lkml.kernel.org/r/20250408164000.3215690-1-fvdl@google.com Link: https://lkml.kernel.org/r/20250407165435.2567898-1-fvdl@google.com Fixes: c009da4258f9 ("mm, cma: support multiple contiguous ranges, if requested") Signed-off-by: Frank van der Linden <fvdl@google.com> Reported-by: Geert Uytterhoeven <geert@linux-m68k.org> Closes: https://lore.kernel.org/linux-mm/CAMuHMdVWviQ7O9yBFE3f=ev0eVb1CnsQvR6SKtEROBbM6z7g3w@mail.gmail.com/ Tested-by: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Muchun Song <muchun.song@linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
90abee6d78
commit
60580e0bd5
19
mm/cma.c
19
mm/cma.c
@ -35,7 +35,7 @@
|
||||
struct cma cma_areas[MAX_CMA_AREAS];
|
||||
unsigned int cma_area_count;
|
||||
|
||||
static int __init __cma_declare_contiguous_nid(phys_addr_t base,
|
||||
static int __init __cma_declare_contiguous_nid(phys_addr_t *basep,
|
||||
phys_addr_t size, phys_addr_t limit,
|
||||
phys_addr_t alignment, unsigned int order_per_bit,
|
||||
bool fixed, const char *name, struct cma **res_cma,
|
||||
@ -370,7 +370,7 @@ int __init cma_declare_contiguous_multi(phys_addr_t total_size,
|
||||
phys_addr_t align, unsigned int order_per_bit,
|
||||
const char *name, struct cma **res_cma, int nid)
|
||||
{
|
||||
phys_addr_t start, end;
|
||||
phys_addr_t start = 0, end;
|
||||
phys_addr_t size, sizesum, sizeleft;
|
||||
struct cma_init_memrange *mrp, *mlp, *failed;
|
||||
struct cma_memrange *cmrp;
|
||||
@ -384,7 +384,7 @@ int __init cma_declare_contiguous_multi(phys_addr_t total_size,
|
||||
/*
|
||||
* First, try it the normal way, producing just one range.
|
||||
*/
|
||||
ret = __cma_declare_contiguous_nid(0, total_size, 0, align,
|
||||
ret = __cma_declare_contiguous_nid(&start, total_size, 0, align,
|
||||
order_per_bit, false, name, res_cma, nid);
|
||||
if (ret != -ENOMEM)
|
||||
goto out;
|
||||
@ -580,7 +580,7 @@ int __init cma_declare_contiguous_nid(phys_addr_t base,
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = __cma_declare_contiguous_nid(base, size, limit, alignment,
|
||||
ret = __cma_declare_contiguous_nid(&base, size, limit, alignment,
|
||||
order_per_bit, fixed, name, res_cma, nid);
|
||||
if (ret != 0)
|
||||
pr_err("Failed to reserve %ld MiB\n",
|
||||
@ -592,14 +592,14 @@ int __init cma_declare_contiguous_nid(phys_addr_t base,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __init __cma_declare_contiguous_nid(phys_addr_t base,
|
||||
static int __init __cma_declare_contiguous_nid(phys_addr_t *basep,
|
||||
phys_addr_t size, phys_addr_t limit,
|
||||
phys_addr_t alignment, unsigned int order_per_bit,
|
||||
bool fixed, const char *name, struct cma **res_cma,
|
||||
int nid)
|
||||
{
|
||||
phys_addr_t memblock_end = memblock_end_of_DRAM();
|
||||
phys_addr_t highmem_start;
|
||||
phys_addr_t highmem_start, base = *basep;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
@ -722,12 +722,15 @@ static int __init __cma_declare_contiguous_nid(phys_addr_t base,
|
||||
}
|
||||
|
||||
ret = cma_init_reserved_mem(base, size, order_per_bit, name, res_cma);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
memblock_phys_free(base, size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
(*res_cma)->nid = nid;
|
||||
*basep = base;
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cma_debug_show_areas(struct cma *cma)
|
||||
|
Loading…
x
Reference in New Issue
Block a user