On Wed, Dec 18, 2024 at 3:32 AM Michal Hocko <mhocko@xxxxxxxx> wrote: > > On Tue 17-12-24 19:07:15, alexei.starovoitov@xxxxxxxxx wrote: > > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > > > Introduce free_pages_nolock() that can free pages without taking locks. > > It relies on trylock and can be called from any context. > > Since spin_trylock() cannot be used in RT from hard IRQ or NMI > > it uses lockless link list to stash the pages which will be freed > > by subsequent free_pages() from good context. > > Yes, this makes sense. Have you tried a simpler implementation that > would just queue on the lockless link list unconditionally? That would > certainly reduce the complexity. Essentially something similar that we > do in vfree_atomic (well, except the queue_work which is likely too > heavy for the usecase and potentialy not reentrant). We cannot use llist approach unconditionally. One of the ways bpf maps are used is non-stop alloc/free. We cannot delay the free part. When memory is free it's better to be available for kernel and bpf uses right away. llist is the last resort.