Re: [PATCH] mm: Remove unused exact_nid parameter from memmap_alloc()

From: Lorenzo Stoakes (ARM)

Date: Tue Sep 15 2026 - 05:46:06 EST


On Mon, Sep 14, 2026 at 01:51:30PM +0800, Kaitao Cheng wrote:
> From: Kaitao Cheng <chengkaitao@xxxxxxxxxx>
>
> Commit ffe55393137c ("mm/sparse: remove sparse buffer pre-allocation
> mechanism") removed sparse_buffer_init(), which was the only caller of
> memmap_alloc() that passed true for exact_nid.
>
> All remaining callers pass false, leaving the exact-node allocation
> branch unreachable. Remove the exact_nid parameter and unconditionally
> use memblock_alloc_try_nid_raw().
>
> This has no functional impact.
>
> Signed-off-by: Kaitao Cheng <chengkaitao@xxxxxxxxxx>
> ---
> mm/mm_init.c | 14 ++++----------
> mm/mm_init.h | 4 ++--
> mm/sparse-vmemmap.c | 2 +-
> mm/sparse.c | 2 +-
> 4 files changed, 8 insertions(+), 14 deletions(-)
>
> diff --git a/mm/mm_init.c b/mm/mm_init.c
> index beeeed4688c1..6af5cabf3e75 100644
> --- a/mm/mm_init.c
> +++ b/mm/mm_init.c
> @@ -1601,7 +1601,7 @@ static void __init free_area_init_core(struct pglist_data *pgdat)
> }
>
> void __init *memmap_alloc(phys_addr_t size, phys_addr_t align,
> - phys_addr_t min_addr, int nid, bool exact_nid)
> + phys_addr_t min_addr, int nid)
> {
> void *ptr;
>
> @@ -1609,14 +1609,8 @@ void __init *memmap_alloc(phys_addr_t size, phys_addr_t align,
> * Kmemleak will explicitly scan mem_map by traversing all valid
> * `struct *page`,so memblock does not need to be added to the scan list.
> */
> - if (exact_nid)
> - ptr = memblock_alloc_exact_nid_raw(size, align, min_addr,
> - MEMBLOCK_ALLOC_NOLEAKTRACE,
> - nid);

I don't see anything else _in the kernel_ reference
memblock_alloc_exact_nid_raw(), though I do see some stuff in
tools/testing/memblock/tests/alloc_exact_nid_api.c.

So I suggest removing memblock_alloc_exact_nid_raw() and
tools/testing/memblock/tests/alloc_exact_nid_api.c (and updating the testing to
account for it as necessary) too.

Also I see both memblock_alloc_try_nid_raw(), memblock_alloc_exact_nid_raw() and
memblock_alloc_try_nid() call memblock_alloc_internal() with an exact_nid last
parameter too.

Only memblock_alloc_exact_nid_raw(), which you should delete, passes this
parameter as true, so you should drop this parameter too.

AND THEN :) it passes exact_nid to memblock_alloc_range_nid() and... I leave it
to you to go investigate if that ever has exact_nid=true passed there.

Let's clean this up all the way please!

> - else
> - ptr = memblock_alloc_try_nid_raw(size, align, min_addr,
> - MEMBLOCK_ALLOC_NOLEAKTRACE,
> - nid);
> + ptr = memblock_alloc_try_nid_raw(size, align, min_addr,
> + MEMBLOCK_ALLOC_NOLEAKTRACE, nid);
>
> if (ptr && size > 0)
> page_init_poison(ptr, size);
> @@ -1644,7 +1638,7 @@ static void __init alloc_node_mem_map(struct pglist_data *pgdat)
> end = ALIGN(pgdat_end_pfn(pgdat), MAX_ORDER_NR_PAGES);
> size = (end - start) * sizeof(struct page);
> map = memmap_alloc(size, SMP_CACHE_BYTES, MEMBLOCK_LOW_LIMIT,
> - pgdat->node_id, false);
> + pgdat->node_id);
> if (!map)
> panic("Failed to allocate %ld bytes for node %d memory map\n",
> size, pgdat->node_id);
> diff --git a/mm/mm_init.h b/mm/mm_init.h
> index c9fc35e7e9f1..a8ed5c20851b 100644
> --- a/mm/mm_init.h
> +++ b/mm/mm_init.h
> @@ -31,8 +31,8 @@ static inline void clear_zone_contiguous(struct zone *zone)
>
> void memblock_free_pages(unsigned long pfn, unsigned int order);
>
> -void *memmap_alloc(phys_addr_t size, phys_addr_t align, phys_addr_t min_addr,
> - int nid, bool exact_nid);
> +void *memmap_alloc(phys_addr_t size, phys_addr_t align,
> + phys_addr_t min_addr, int nid);
>
> void memmap_init_range(unsigned long size, int nid, unsigned long zone,
> unsigned long start_pfn, unsigned long zone_end_pfn,
> diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
> index f22d815d7af0..c2fa5fbf0972 100644
> --- a/mm/sparse-vmemmap.c
> +++ b/mm/sparse-vmemmap.c
> @@ -53,7 +53,7 @@ static void * __ref __earlyonly_bootmem_alloc(int node,
> unsigned long align,
> unsigned long goal)
> {
> - return memmap_alloc(size, align, goal, node, false);
> + return memmap_alloc(size, align, goal, node);
> }
>
> void * __meminit vmemmap_alloc_block(unsigned long size, int node)
> diff --git a/mm/sparse.c b/mm/sparse.c
> index cc28bb41fdb1..f032c98b92d9 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -215,7 +215,7 @@ struct page __init *__populate_section_memmap(unsigned long pfn,
> {
> const unsigned long size = PAGE_ALIGN(sizeof(struct page) * PAGES_PER_SECTION);
>
> - return memmap_alloc(size, size, __pa(MAX_DMA_ADDRESS), nid, false);
> + return memmap_alloc(size, size, __pa(MAX_DMA_ADDRESS), nid);
> }
> #endif /* !CONFIG_SPARSEMEM_VMEMMAP */
>
> --
> 2.54.0 (Apple Git-157)
>

--
Cheers, Lorenzo