Re: [PATCH v2 3/9] mm: hugetlb: directly pass order when allocate a hugetlb folio

Kefeng Wang
2025-09-09T07:11:55Z

On 2025/9/9 9:11, Zi Yan wrote:
> On 2 Sep 2025, at 8:48, Kefeng Wang wrote:
>
>> Use order instead of struct hstate to remove huge_page_order() call
>> from all hugetlb folio allocation.
>>
>> Reviewed-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
>> Reviewed-by: Jane Chu <jane.chu@oracle.com>
>> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
>> ---
>> mm/hugetlb.c | 27 +++++++++++++--------------
>> mm/hugetlb_cma.c | 3 +--
>> mm/hugetlb_cma.h | 6 +++---
>> 3 files changed, 17 insertions(+), 19 deletions(-)
>>
>> diff --git a/mm/hugetlb.c b/mm/hugetlb.c
>> index 4131467fc1cd..5c93faf82674 100644
>> --- a/mm/hugetlb.c
>> +++ b/mm/hugetlb.c
>> @@ -1473,17 +1473,16 @@ static int hstate_next_node_to_free(struct hstate *h, nodemask_t *nodes_allowed)
>>
>> #ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE
>> #ifdef CONFIG_CONTIG_ALLOC
>> -static struct folio *alloc_gigantic_folio(struct hstate *h, gfp_t gfp_mask,
>> +static struct folio *alloc_gigantic_folio(int order, gfp_t gfp_mask,
>> int nid, nodemask_t *nodemask)
>> {
>> struct folio *folio;
>> - int order = huge_page_order(h);
>> bool retried = false;
>>
>> if (nid == NUMA_NO_NODE)
>> nid = numa_mem_id();
>> retry:
>> - folio = hugetlb_cma_alloc_folio(h, gfp_mask, nid, nodemask);
>> + folio = hugetlb_cma_alloc_folio(order, gfp_mask, nid, nodemask);
>> if (!folio) {
>> if (hugetlb_cma_exclusive_alloc())
>> return NULL;
>> @@ -1506,16 +1505,16 @@ static struct folio *alloc_gigantic_folio(struct hstate *h, gfp_t gfp_mask,
>> }
>>
>> #else /* !CONFIG_CONTIG_ALLOC */
>> -static struct folio *alloc_gigantic_folio(struct hstate *h, gfp_t gfp_mask,
>> - int nid, nodemask_t *nodemask)
>> +static struct folio *alloc_gigantic_folio(int order, gfp_t gfp_mask, int nid,
>> + nodemask_t *nodemask)
>> {
>> return NULL;
>> }
>> #endif /* CONFIG_CONTIG_ALLOC */
>>
>> #else /* !CONFIG_ARCH_HAS_GIGANTIC_PAGE */
>> -static struct folio *alloc_gigantic_folio(struct hstate *h, gfp_t gfp_mask,
>> - int nid, nodemask_t *nodemask)
>> +static struct folio *alloc_gigantic_folio(int order, gfp_t gfp_mask, int nid,
>> + nodemask_t *nodemask)
>> {
>> return NULL;
>> }
>> @@ -1926,11 +1925,9 @@ struct address_space *hugetlb_folio_mapping_lock_write(struct folio *folio)
>> return NULL;
>> }
>>
>> -static struct folio *alloc_buddy_hugetlb_folio(struct hstate *h,
>> - gfp_t gfp_mask, int nid, nodemask_t *nmask,
>> - nodemask_t *node_alloc_noretry)
>> +static struct folio *alloc_buddy_hugetlb_folio(int order, gfp_t gfp_mask,
>> + int nid, nodemask_t *nmask, nodemask_t *node_alloc_noretry)
>> {
>> - int order = huge_page_order(h);
>> struct folio *folio;
>> bool alloc_try_hard = true;
>>
>> @@ -1980,11 +1977,13 @@ static struct folio *only_alloc_fresh_hugetlb_folio(struct hstate *h,
>> nodemask_t *node_alloc_noretry)
>> {
>> struct folio *folio;
>> + int order = huge_page_order(h);
>>
>> - if (hstate_is_gigantic(h))
>> - folio = alloc_gigantic_folio(h, gfp_mask, nid, nmask);
>> + if (order > MAX_PAGE_ORDER)
>
> Would it be better to add
>
> bool order_is_gigantic(unsigned int order)
> {
> return order > MAX_PAGE_ORDER;
> }
>
> for this check? And change hstate_is_gigantic() to
>
> return order_is_gigantic(huge_page_order(h));
>
> To make _is_gigantic() check more consistent.
> BTW, isolate_or_dissolve_huge_folio() can use order_is_gigantic() too.

It may not be very valuable, but I could do it in the next.

>
> Otherwise, Reviewed-by: Zi Yan <ziy@nvidia.com>
>

Thanks.