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

From: Mike Rapoport <[email-masked]>
Date: Tue, 28 Apr 2026 09:30:13 +0200

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 <[email-masked]>
> ---
>  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) <[email-masked]>

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

-- 
Sincerely yours,
Mike.