On Mon, Jun 08, 2026 at 04:35:05AM -0400, Michael S. Tsirkin wrote: > Move vma_alloc_folio_noprof() from an inline in gfp.h (for !NUMA) > and mempolicy.c (for NUMA) to page_alloc.c.
This is an incorrectly described patch. You're not moving the function, you're also altering its behaviour. Do the two changes separately, and justify why you are changing this behaviour. > > This prepares for a subsequent patch that will thread user_addr > through the allocator: having vma_alloc_folio_noprof in page_alloc.c > means user_addr can be passed to the internal allocation path > without changing public API signatures or duplicating plumbing > in both gfp.h and mempolicy.c. We seem to have a fun mess with some NUMA stuff living in mempolicy.c and some living in page_alloc.c with #ifdef CONFIG_NUMA's around it. But I guess that was a pre-existing problem... > > The !NUMA path gains the VM_DROPPABLE -> __GFP_NOWARN check > that the NUMA path already had. What is your justification for doing this? Commit messages that put the code changes in English are not helpful, tell me _why_ you are doing this. It seems that you're suggesting not doing this was a pre-existing bug? Therefore it would need a fixes/cc: stable no? Unless you feel this isn't significant enough to require that? If not, then why are you changing this behaviour? > > 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/gfp.h | 9 ++------- > mm/mempolicy.c | 32 -------------------------------- > mm/page_alloc.c | 43 +++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 45 insertions(+), 39 deletions(-) > > diff --git a/include/linux/gfp.h b/include/linux/gfp.h > index 51ef13ed756e..7ccbda35b9ad 100644 > --- a/include/linux/gfp.h > +++ b/include/linux/gfp.h > @@ -318,13 +318,13 @@ static inline struct page *alloc_pages_node_noprof(int > nid, gfp_t gfp_mask, > > #define alloc_pages_node(...) > alloc_hooks(alloc_pages_node_noprof(__VA_ARGS__)) > > +struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order, > + struct vm_area_struct *vma, unsigned long addr); > #ifdef CONFIG_NUMA > struct page *alloc_pages_noprof(gfp_t gfp, unsigned int order); > struct folio *folio_alloc_noprof(gfp_t gfp, unsigned int order); > struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order, > struct mempolicy *mpol, pgoff_t ilx, int nid); > -struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order, struct > vm_area_struct *vma, > - unsigned long addr); > #else > static inline struct page *alloc_pages_noprof(gfp_t gfp_mask, unsigned int > order) > { > @@ -339,11 +339,6 @@ static inline struct folio > *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int orde > { > return folio_alloc_noprof(gfp, order); > } > -static inline struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order, > - struct vm_area_struct *vma, unsigned long addr) > -{ > - return folio_alloc_noprof(gfp, order); > -} > #endif > > #define alloc_pages(...) > alloc_hooks(alloc_pages_noprof(__VA_ARGS__)) > diff --git a/mm/mempolicy.c b/mm/mempolicy.c > index d139b074a599..a1707ad498a8 100644 > --- a/mm/mempolicy.c > +++ b/mm/mempolicy.c > @@ -2516,38 +2516,6 @@ struct folio *folio_alloc_mpol_noprof(gfp_t gfp, > unsigned int order, > return page_rmappable_folio(page); > } > > -/** > - * vma_alloc_folio - Allocate a folio for a VMA. > - * @gfp: GFP flags. > - * @order: Order of the folio. > - * @vma: Pointer to VMA. > - * @addr: Virtual address of the allocation. Must be inside @vma. > - * > - * Allocate a folio for a specific address in @vma, using the appropriate > - * NUMA policy. The caller must hold the mmap_lock of the mm_struct of the > - * VMA to prevent it from going away. Should be used for all allocations > - * for folios that will be mapped into user space, excepting hugetlbfs, and > - * excepting where direct use of folio_alloc_mpol() is more appropriate. > - * > - * Return: The folio on success or NULL if allocation fails. > - */ > -struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order, struct > vm_area_struct *vma, > - unsigned long addr) > -{ > - struct mempolicy *pol; > - pgoff_t ilx; > - struct folio *folio; > - > - if (vma->vm_flags & VM_DROPPABLE) > - gfp |= __GFP_NOWARN; > - > - pol = get_vma_policy(vma, addr, order, &ilx); > - folio = folio_alloc_mpol_noprof(gfp, order, pol, ilx, numa_node_id()); > - mpol_cond_put(pol); > - return folio; > -} > -EXPORT_SYMBOL(vma_alloc_folio_noprof); > - > struct page *alloc_frozen_pages_noprof(gfp_t gfp, unsigned order) > { > struct mempolicy *pol = &default_policy; > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 8dae5b3f5876..6a605d05e8cd 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -5286,6 +5286,49 @@ struct folio *__folio_alloc_noprof(gfp_t gfp, unsigned > int order, int preferred_ > } > EXPORT_SYMBOL(__folio_alloc_noprof); > > +#ifdef CONFIG_NUMA > +/** > + * vma_alloc_folio - Allocate a folio for a VMA. > + * @gfp: GFP flags. > + * @order: Order of the folio. > + * @vma: Pointer to VMA. > + * @addr: Virtual address of the allocation. Must be inside @vma. > + * > + * Allocate a folio for a specific address in @vma, using the appropriate > + * NUMA policy. The caller must hold the mmap_lock of the mm_struct of the > + * VMA to prevent it from going away. Should be used for all allocations > + * for folios that will be mapped into user space, excepting hugetlbfs, and > + * excepting where direct use of folio_alloc_mpol() is more appropriate. > + * > + * Return: The folio on success or NULL if allocation fails. > + */ > +struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order, > + struct vm_area_struct *vma, unsigned long addr) > +{ > + struct mempolicy *pol; > + pgoff_t ilx; > + struct folio *folio; > + > + if (vma->vm_flags & VM_DROPPABLE) > + gfp |= __GFP_NOWARN; > + > + pol = get_vma_policy(vma, addr, order, &ilx); > + folio = folio_alloc_mpol_noprof(gfp, order, pol, ilx, numa_node_id()); > + mpol_cond_put(pol); > + return folio; > +} > +#else > +struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order, > + struct vm_area_struct *vma, unsigned long addr) > +{ > + if (vma->vm_flags & VM_DROPPABLE) > + gfp |= __GFP_NOWARN; > + > + return folio_alloc_noprof(gfp, order); > +} > +#endif > +EXPORT_SYMBOL(vma_alloc_folio_noprof); > + > /* > * Common helper functions. Never use with __GFP_HIGHMEM because the returned > * address cannot represent highmem pages. Use alloc_pages and then kmap if > -- > MST > Thanks, Lorenzo

