On 1/25/24 22:12, Alexandru Elisei wrote: > As an architecture might have specific requirements around the allocation > of CMA pages, add an arch hook that can disable allocations from > MIGRATE_CMA, if the allocation was otherwise allowed. > > This will be used by arm64, which will put tag storage pages on the > MIGRATE_CMA list, and tag storage pages cannot be tagged. The filter will > be used to deny using MIGRATE_CMA for __GFP_TAGGED allocations. Just wondering how allocation requests would be blocked for direct alloc_contig_range() requests ? > > Signed-off-by: Alexandru Elisei <alexandru.elisei@xxxxxxx> > --- > include/linux/pgtable.h | 7 +++++++ > mm/page_alloc.c | 3 ++- > 2 files changed, 9 insertions(+), 1 deletion(-) > > diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h > index 6d98d5fdd697..c5ddec6b5305 100644 > --- a/include/linux/pgtable.h > +++ b/include/linux/pgtable.h > @@ -905,6 +905,13 @@ static inline void arch_do_swap_page(struct mm_struct *mm, > static inline void arch_free_pages_prepare(struct page *page, int order) { } > #endif > > +#ifndef __HAVE_ARCH_ALLOC_CMA Same as last patch i.e __HAVE_ARCH_ALLOC_CMA could be avoided via a direct check on #ifndef arch_alloc_cma instead. > +static inline bool arch_alloc_cma(gfp_t gfp) > +{ > + return true; > +} > +#endif > + > #ifndef __HAVE_ARCH_UNMAP_ONE > /* > * Some architectures support metadata associated with a page. When a > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 27282a1c82fe..a96d47a6393e 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -3157,7 +3157,8 @@ static inline unsigned int gfp_to_alloc_flags_cma(gfp_t gfp_mask, > unsigned int alloc_flags) > { > #ifdef CONFIG_CMA > - if (gfp_migratetype(gfp_mask) == MIGRATE_MOVABLE) > + if (gfp_migratetype(gfp_mask) == MIGRATE_MOVABLE && > + arch_alloc_cma(gfp_mask)) > alloc_flags |= ALLOC_CMA; > #endif > return alloc_flags;