On Mon, Dec 9, 2024 at 9:31 PM Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > On Mon, Dec 09, 2024 at 06:39:31PM -0800, Alexei Starovoitov wrote: > > + if (preemptible() && !rcu_preempt_depth()) > > + return alloc_pages_node_noprof(nid, > > + GFP_NOWAIT | __GFP_ZERO, > > + order); > > + return alloc_pages_node_noprof(nid, > > + __GFP_TRYLOCK | __GFP_NOWARN | __GFP_ZERO, > > + order); > > [...] > > > @@ -4009,7 +4018,7 @@ gfp_to_alloc_flags(gfp_t gfp_mask, unsigned int order) > > * set both ALLOC_NON_BLOCK and ALLOC_MIN_RESERVE(__GFP_HIGH). > > */ > > alloc_flags |= (__force int) > > - (gfp_mask & (__GFP_HIGH | __GFP_KSWAPD_RECLAIM)); > > + (gfp_mask & (__GFP_HIGH | __GFP_KSWAPD_RECLAIM | __GFP_TRYLOCK)); > > It's not quite clear to me that we need __GFP_TRYLOCK to implement this. > I was originally wondering if this wasn't a memalloc_nolock_save() / > memalloc_nolock_restore() situation (akin to memalloc_nofs_save/restore), Interesting idea. It could be useful to pass extra flags into free_page path, since it doesn't have flags today and I'm adding free_pages_nolock() in patch 2 just to pass fpi_t fpi_flags around. memalloc_nofs_save()-like makes the most sense when there are multiple allocations and code path attempts to be generic. For bpf use case it's probably overkill. I guess we might have both __GFP_TRYLOCK and memalloc_nolock_save() that clear many flags. Note it needs to clear __GFP_KSWAPD_RECLAIM which is not safe when raw spin lock is held. > but I wonder if we can simply do: > > if (!preemptible() || rcu_preempt_depth()) > alloc_flags |= ALLOC_TRYLOCK; I don't think we can do that. It will penalize existing GFP_ATOMIC/NOWAIT users. kmalloc from RCU CS with GFP_NOWAIT is fine today.