On Mon, May 11, 2026 at 05:03:02AM -0400, Michael S. Tsirkin wrote:
> Convert the hugetlb fault and fallocate paths to use __GFP_ZERO.
> For pages allocated from the buddy allocator, post_alloc_hook()
> handles zeroing.
> 
> Hugetlb surplus pages need special handling because they can be
> pre-allocated into the pool during mmap (by hugetlb_acct_memory)
> before any page fault.  Pool pages are kept around and may need
> zeroing long after buddy allocation, so a buddy-level zeroed
> hint (consumed at allocation time) cannot track their state.
> 
> Add a bool *zeroed output parameter to alloc_hugetlb_folio()
> so callers know whether the page needs zeroing.  Buddy-allocated
> pages are always zeroed (zeroed by post_alloc_hook).  Pool
> pages use a new HPG_zeroed flag to track whether the page is
> known-zero (freshly buddy-allocated, never mapped to userspace).
> The flag is set in alloc_surplus_hugetlb_folio() after buddy
> allocation and cleared in free_huge_folio() when a user-mapped
> page returns to the pool.
> 
> Callers that do not need zeroing (CoW, migration) pass NULL for
> zeroed and 0 for gfp.
> 
> 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    | 10 ++++++--
>  include/linux/hugetlb.h |  8 +++++--
>  mm/hugetlb.c            | 52 ++++++++++++++++++++++++++++++-----------
>  3 files changed, 53 insertions(+), 17 deletions(-)
> 
> diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
> index 8b05bec08e04..24e42cb10ade 100644
> --- a/fs/hugetlbfs/inode.c
> +++ b/fs/hugetlbfs/inode.c
> @@ -810,14 +810,20 @@ static long hugetlbfs_fallocate(struct file *file, int 
> mode, loff_t offset,
>                * folios in these areas, we need to consume the reserves
>                * to keep reservation accounting consistent.
>                */
> -             folio = alloc_hugetlb_folio(&pseudo_vma, addr, false);
> +             {
> +             bool zeroed;
> +
> +             folio = alloc_hugetlb_folio(&pseudo_vma, addr, false,
> +                                        __GFP_ZERO, &zeroed);

This feels like a very odd pattern:

  1) ask for __GFP_ZERO
  2) Have to check whether it was actually zeroed

Seems like the zeroing piece should just be sunk in if you're going to
ask for __GFP_ZERO anyway.  And in that case, maybe just `bool zero` as
an argument, rather than GFP (to avoid future overloading of flags).

~Gregory

Reply via email to