On Tue, May 12, 2026 at 05:06:37PM -0400, Michael S. Tsirkin wrote:
> Add a gfp_t parameter to alloc_hugetlb_folio(). When __GFP_ZERO
> is set, the function guarantees the returned folio is zeroed:
> - Fresh allocations (buddy or gigantic): zeroed by
>   post_alloc_hook via __GFP_ZERO.
> - Pool pages with HPG_zeroed set: already zeroed, skip.
> - Pool pages without HPG_zeroed: zeroed via folio_zero_user().
> 
> The address parameter is renamed to user_addr; the function
> aligns it internally for reservation and NUMA policy lookups.
> For pool pages that need zeroing, user_addr is passed to
> folio_zero_user() for cache-friendly zeroing near the faulting
> subpage.  All callers pass a page-aligned address; the
> hugetlb_no_page caller passes vmf->real_address & PAGE_MASK
> for consistency.
> 
> HPG_zeroed (stored in hugetlb folio->private bits) tracks
> known-zero pool pages. It is set when alloc_surplus_hugetlb_folio
> allocates with __GFP_ZERO, and cleared in free_huge_folio when
> the page returns to the pool after userspace use.
> 
> Suggested-by: Gregory Price <[email protected]>
> Signed-off-by: Michael S. Tsirkin <[email protected]>
> Assisted-by: Claude:claude-opus-4-6
> Assisted-by: cursor-agent:GPT-5.4-xhigh
> ---
>  fs/hugetlbfs/inode.c    |  3 +--
>  include/linux/hugetlb.h |  5 ++++-
>  mm/hugetlb.c            | 47 ++++++++++++++++++++++++++++++-----------
>  3 files changed, 40 insertions(+), 15 deletions(-)
> 

This seems much much cleaner this way.  One nit, doesn't need a respin
unless you feel like it.

Reviewed-by: Gregory Price <[email protected]>


> @@ -2980,6 +2993,11 @@ struct folio *alloc_hugetlb_folio(struct 
> vm_area_struct *vma,
>  
>       spin_unlock_irq(&hugetlb_lock);
>  
> +     if ((gfp & __GFP_ZERO) && from_pool &&
> +         !folio_test_hugetlb_zeroed(folio))

stupid question:

   if (!from_pool) - wouldn't folio_test_hugetlb_zeroed(folio) be true
   because __GFP_ZERO is passed?

   If not, SHOULD it be true (i.e. should we be setting that in the
   non-pool allocation path when __GFP_ZERO is passed and allocation
   succeeds?)

If so, can this just be simplified to:

if ((gfp & __GFP_ZERO) && !folio_test_hugetlb_zeroed(folio))

Maybe that lets you eliminate the bool entirely?

~Gregory

Reply via email to