On Tue, May 12, 2026 at 06:03:39PM -0400, Gregory Price wrote:
> 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

Agreed. I will include this if I need to respin.

-- 
MST


Reply via email to