Use vma_alloc_folio_hints() and check PGHINT_ZEROED to skip folio_zero_user() in the PMD THP anonymous page allocation path when the page is already zeroed.
Signed-off-by: Michael S. Tsirkin <[email protected]> Assisted-by: Claude:claude-opus-4-6 Assisted-by: cursor-agent:GPT-5.4-xhigh --- mm/huge_memory.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index b298cba853ab..243592452ead 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1259,8 +1259,10 @@ static struct folio *vma_alloc_anon_folio_pmd(struct vm_area_struct *vma, gfp_t gfp = vma_thp_gfp_mask(vma); const int order = HPAGE_PMD_ORDER; struct folio *folio; + pghint_t hints; - folio = vma_alloc_folio(gfp, order, vma, addr & HPAGE_PMD_MASK); + folio = vma_alloc_folio_hints(gfp, order, vma, addr & HPAGE_PMD_MASK, + &hints); if (unlikely(!folio)) { count_vm_event(THP_FAULT_FALLBACK); @@ -1279,13 +1281,7 @@ static struct folio *vma_alloc_anon_folio_pmd(struct vm_area_struct *vma, } folio_throttle_swaprate(folio, gfp); - /* - * When a folio is not zeroed during allocation (__GFP_ZERO not used) - * or user folios require special handling, folio_zero_user() is used to - * make sure that the page corresponding to the faulting address will be - * hot in the cache after zeroing. - */ - if (user_alloc_needs_zeroing()) + if (user_alloc_needs_zeroing() && !(hints & PGHINT_ZEROED)) folio_zero_user(folio, addr); /* * The memory barrier inside __folio_mark_uptodate makes sure that -- MST

