I like this proposal better. I am still not convinced that we really need internal __GFP_TRYLOCK though. If we reduce try_alloc_pages to the gfp usage we are at the following On Tue 17-12-24 19:07:14, alexei.starovoitov@xxxxxxxxx wrote: [...] > +struct page *try_alloc_pages_noprof(int nid, unsigned int order) > +{ > + gfp_t alloc_gfp = __GFP_NOWARN | __GFP_ZERO | > + __GFP_NOMEMALLOC | __GFP_TRYLOCK; > + unsigned int alloc_flags = ALLOC_TRYLOCK; [...] > + prepare_alloc_pages(alloc_gfp, order, nid, NULL, &ac, > + &alloc_gfp, &alloc_flags); [...] > + page = get_page_from_freelist(alloc_gfp, order, alloc_flags, &ac); > + > + /* Unlike regular alloc_pages() there is no __alloc_pages_slowpath(). */ > + > + trace_mm_page_alloc(page, order, alloc_gfp & ~__GFP_TRYLOCK, ac.migratetype); > + kmsan_alloc_page(page, order, alloc_gfp); [...]