Thread pghint_t *hints through the hugetlb buddy allocation path:
  alloc_buddy_frozen_folio -> only_alloc_fresh_hugetlb_folio

alloc_buddy_frozen_folio now calls __alloc_frozen_pages_hints()
so the reported-page zeroed hint can propagate up.

Add pghint_t *hints to alloc_hugetlb_folio_reserve() for the
memfd path.  Callers that do not need hints pass NULL.

No functional change yet: hints are threaded but not acted upon.

Signed-off-by: Michael S. Tsirkin <[email protected]>
Assisted-by: Claude:claude-opus-4-6
Assisted-by: cursor-agent:GPT-5.4-xhigh
---
 include/linux/hugetlb.h |  6 ++++--
 mm/hugetlb.c            | 29 ++++++++++++++++++++---------
 mm/memfd.c              |  2 +-
 3 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 65910437be1c..7311ad87add4 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -710,7 +710,8 @@ struct folio *alloc_hugetlb_folio_nodemask(struct hstate 
*h, int preferred_nid,
                                nodemask_t *nmask, gfp_t gfp_mask,
                                bool allow_alloc_fallback);
 struct folio *alloc_hugetlb_folio_reserve(struct hstate *h, int preferred_nid,
-                                         nodemask_t *nmask, gfp_t gfp_mask);
+                               nodemask_t *nmask, gfp_t gfp_mask,
+                               pghint_t *hints);
 
 int hugetlb_add_to_page_cache(struct folio *folio, struct address_space 
*mapping,
                        pgoff_t idx);
@@ -1124,7 +1125,8 @@ static inline struct folio *alloc_hugetlb_folio(struct 
vm_area_struct *vma,
 
 static inline struct folio *
 alloc_hugetlb_folio_reserve(struct hstate *h, int preferred_nid,
-                           nodemask_t *nmask, gfp_t gfp_mask)
+                           nodemask_t *nmask, gfp_t gfp_mask,
+                           pghint_t *hints)
 {
        return NULL;
 }
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 327eaa4074d3..faa94a114fd4 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1842,7 +1842,8 @@ struct address_space 
*hugetlb_folio_mapping_lock_write(struct folio *folio)
 }
 
 static struct folio *alloc_buddy_frozen_folio(int order, gfp_t gfp_mask,
-               int nid, nodemask_t *nmask, nodemask_t *node_alloc_noretry)
+               int nid, nodemask_t *nmask, nodemask_t *node_alloc_noretry,
+               pghint_t *hints)
 {
        struct folio *folio;
        bool alloc_try_hard = true;
@@ -1859,7 +1860,8 @@ static struct folio *alloc_buddy_frozen_folio(int order, 
gfp_t gfp_mask,
        if (alloc_try_hard)
                gfp_mask |= __GFP_RETRY_MAYFAIL;
 
-       folio = (struct folio *)__alloc_frozen_pages(gfp_mask, order, nid, 
nmask);
+       folio = (struct folio *)__alloc_frozen_pages_hints(gfp_mask, order,
+                                                         nid, nmask, hints);
 
        /*
         * If we did not specify __GFP_RETRY_MAYFAIL, but still got a
@@ -1888,11 +1890,14 @@ static struct folio *alloc_buddy_frozen_folio(int 
order, gfp_t gfp_mask,
 
 static struct folio *only_alloc_fresh_hugetlb_folio(struct hstate *h,
                gfp_t gfp_mask, int nid, nodemask_t *nmask,
-               nodemask_t *node_alloc_noretry)
+               nodemask_t *node_alloc_noretry, pghint_t *hints)
 {
        struct folio *folio;
        int order = huge_page_order(h);
 
+       if (hints)
+               *hints = 0;
+
        if (nid == NUMA_NO_NODE)
                nid = numa_mem_id();
 
@@ -1900,7 +1905,7 @@ static struct folio 
*only_alloc_fresh_hugetlb_folio(struct hstate *h,
                folio = alloc_gigantic_frozen_folio(order, gfp_mask, nid, 
nmask);
        else
                folio = alloc_buddy_frozen_folio(order, gfp_mask, nid, nmask,
-                                                node_alloc_noretry);
+                                                node_alloc_noretry, hints);
        if (folio)
                init_new_hugetlb_folio(folio);
        return folio;
@@ -1918,7 +1923,8 @@ static struct folio *alloc_fresh_hugetlb_folio(struct 
hstate *h,
 {
        struct folio *folio;
 
-       folio = only_alloc_fresh_hugetlb_folio(h, gfp_mask, nid, nmask, NULL);
+       folio = only_alloc_fresh_hugetlb_folio(h, gfp_mask, nid, nmask,
+                                             NULL, NULL);
        if (folio)
                hugetlb_vmemmap_optimize_folio(h, folio);
        return folio;
@@ -1958,7 +1964,8 @@ static struct folio *alloc_pool_huge_folio(struct hstate 
*h,
                struct folio *folio;
 
                folio = only_alloc_fresh_hugetlb_folio(h, gfp_mask, node,
-                                       nodes_allowed, node_alloc_noretry);
+                                       nodes_allowed, node_alloc_noretry,
+                                       NULL);
                if (folio)
                        return folio;
        }
@@ -2231,10 +2238,13 @@ struct folio 
*alloc_buddy_hugetlb_folio_with_mpol(struct hstate *h,
 }
 
 struct folio *alloc_hugetlb_folio_reserve(struct hstate *h, int preferred_nid,
-               nodemask_t *nmask, gfp_t gfp_mask)
+               nodemask_t *nmask, gfp_t gfp_mask, pghint_t *hints)
 {
        struct folio *folio;
 
+       if (hints)
+               *hints = (pghint_t)0;
+
        spin_lock_irq(&hugetlb_lock);
        if (!h->resv_huge_pages) {
                spin_unlock_irq(&hugetlb_lock);
@@ -3434,13 +3444,14 @@ static void __init 
hugetlb_hstate_alloc_pages_onenode(struct hstate *h, int nid)
                        gfp_t gfp_mask = htlb_alloc_mask(h) | __GFP_THISNODE;
 
                        folio = only_alloc_fresh_hugetlb_folio(h, gfp_mask, nid,
-                                       &node_states[N_MEMORY], NULL);
+                                       &node_states[N_MEMORY], NULL, NULL);
                        if (!folio && !list_empty(&folio_list) &&
                            hugetlb_vmemmap_optimizable_size(h)) {
                                prep_and_add_allocated_folios(h, &folio_list);
                                INIT_LIST_HEAD(&folio_list);
                                folio = only_alloc_fresh_hugetlb_folio(h, 
gfp_mask, nid,
-                                               &node_states[N_MEMORY], NULL);
+                                               &node_states[N_MEMORY], NULL,
+                                               NULL);
                        }
                        if (!folio)
                                break;
diff --git a/mm/memfd.c b/mm/memfd.c
index 919c2a53eb96..f1c00600e19a 100644
--- a/mm/memfd.c
+++ b/mm/memfd.c
@@ -93,7 +93,7 @@ struct folio *memfd_alloc_folio(struct file *memfd, pgoff_t 
idx)
                folio = alloc_hugetlb_folio_reserve(h,
                                                    numa_node_id(),
                                                    NULL,
-                                                   gfp_mask);
+                                                   gfp_mask, NULL);
                if (folio) {
                        u32 hash;
 
-- 
MST


Reply via email to