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 protected]>
> ---
>  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 protected]>

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

-- 
Sincerely yours,
Mike.

Reply via email to