On Tue, 10 May 2022 19:38:08 +0800 Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx> wrote: > We expect no warnings to be issued when we specify __GFP_NOWARN, but > currently in paths like alloc_pages() and kmalloc(), there are still > some warnings printed, fix it. Looks sane to me. > --- a/mm/internal.h > +++ b/mm/internal.h > @@ -35,6 +35,17 @@ struct folio_batch; > /* Do not use these with a slab allocator */ > #define GFP_SLAB_BUG_MASK (__GFP_DMA32|__GFP_HIGHMEM|~__GFP_BITS_MASK) > > +#define WARN_ON_ONCE_GFP(cond, gfp) ({ \ > + static bool __section(".data.once") __warned; \ > + int __ret_warn_once = !!(cond); \ > + \ > + if (unlikely(!(gfp & __GFP_NOWARN) && __ret_warn_once && !__warned)) { \ > + __warned = true; \ > + WARN_ON(1); \ > + } \ > + unlikely(__ret_warn_once); \ > +}) I don't think WARN_ON_ONCE_GFP is a good name for this. But WARN_ON_ONCE_IF_NOT_GFP_NOWARN is too long :( WARN_ON_ONCE_NOWARN might be better. No strong opinion here, really. > @@ -4902,8 +4906,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, > * We also sanity check to catch abuse of atomic reserves being used by > * callers that are not in atomic context. > */ > - if (WARN_ON_ONCE((gfp_mask & (__GFP_ATOMIC|__GFP_DIRECT_RECLAIM)) == > - (__GFP_ATOMIC|__GFP_DIRECT_RECLAIM))) > + if (WARN_ON_ONCE_GFP((gfp_mask & (__GFP_ATOMIC|__GFP_DIRECT_RECLAIM)) == > + (__GFP_ATOMIC|__GFP_DIRECT_RECLAIM), gfp_mask)) > gfp_mask &= ~__GFP_ATOMIC; > > retry_cpuset: I dropped this hunk - Neil's "mm: discard __GFP_ATOMIC" (https://lkml.kernel.org/r/163712397076.13692.4727608274002939094@xxxxxxxxxxxxxxxxxxxxx) deleted this code.