Re: [PATCH 14/49] mm/cma: validate hugetlb CMA range by zone at reserve time

From: Mike Rapoport

Date: Tue Apr 28 2026 - 03:43:06 EST


On Sun, Apr 05, 2026 at 08:52:05PM +0800, Muchun Song wrote:
> During hugetlb_cma_reserve() we already have access to zone information, so we
> can validate that the reserved CMA range does not span multiple zones.
>
> Doing this check up front allows future hugetlb allocations from CMA to assume
> zone-valid CMA areas, avoiding additional validity checks and potential
> fallback/rollback paths, greatly simplifying the code.
>
> The pfn_valid() check is removed from cma_validate_zones() because mem_section is
> not initialized at that stage and it can trigger false warnings; keep the
> sanity check in cma_activate_area() instead. This is preparatory work for the
> follow-up simplification.
>
> Signed-off-by: Muchun Song <songmuchun@xxxxxxxxxxxxx>
> ---
> mm/cma.c | 3 ++-
> mm/hugetlb_cma.c | 3 ++-
> 2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/mm/cma.c b/mm/cma.c
> index 15cc0ae76c8e..dd046a23f467 100644
> --- a/mm/cma.c
> +++ b/mm/cma.c
> @@ -125,7 +125,6 @@ bool cma_validate_zones(struct cma *cma)
> * to be in the same zone. Simplify by forcing the entire
> * CMA resv range to be in the same zone.
> */
> - WARN_ON_ONCE(!pfn_valid(base_pfn));
> if (pfn_range_intersects_zones(cma->nid, base_pfn, cmr->count)) {
> set_bit(CMA_ZONES_INVALID, &cma->flags);
> return false;
> @@ -164,6 +163,8 @@ static void __init cma_activate_area(struct cma *cma)
> bitmap_set(cmr->bitmap, 0, bitmap_count);
> }
>
> + WARN_ON_ONCE(!pfn_valid(cmr->base_pfn));
> +
> for (pfn = early_pfn[r]; pfn < cmr->base_pfn + cmr->count;
> pfn += pageblock_nr_pages)
> init_cma_reserved_pageblock(pfn_to_page(pfn));
> diff --git a/mm/hugetlb_cma.c b/mm/hugetlb_cma.c
> index f83ae4998990..b068e9bf6537 100644
> --- a/mm/hugetlb_cma.c
> +++ b/mm/hugetlb_cma.c
> @@ -233,9 +233,10 @@ void __init hugetlb_cma_reserve(void)
> res = cma_declare_contiguous_multi(size, PAGE_SIZE << order,
> HUGETLB_PAGE_ORDER, name,
> &hugetlb_cma[nid], nid);
> - if (res) {
> + if (res || !cma_validate_zones(hugetlb_cma[nid])) {
> pr_warn("hugetlb_cma: reservation failed: err %d, node %d",
> res, nid);

The warning here should be updated as well. Other than that

Acked-by: Mike Rapoport (Microsoft) <rppt@xxxxxxxxxx>

> + hugetlb_cma[nid] = NULL;
> continue;
> }
>
> --
> 2.20.1
>

--
Sincerely yours,
Mike.