On Thu, Jan 23, 2025 at 07:56:50PM -0800, Alexei Starovoitov wrote: > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > Tracing BPF programs execute from tracepoints and kprobes where > running context is unknown, but they need to request additional > memory. The prior workarounds were using pre-allocated memory and > BPF specific freelists to satisfy such allocation requests. > Instead, introduce gfpflags_allow_spinning() condition that signals > to the allocator that running context is unknown. > Then rely on percpu free list of pages to allocate a page. > try_alloc_pages() -> get_page_from_freelist() -> rmqueue() -> > rmqueue_pcplist() will spin_trylock to grab the page from percpu > free list. If it fails (due to re-entrancy or list being empty) > then rmqueue_bulk()/rmqueue_buddy() will attempt to > spin_trylock zone->lock and grab the page from there. > spin_trylock() is not safe in PREEMPT_RT when in NMI or in hard IRQ. > Bailout early in such case. > > The support for gfpflags_allow_spinning() mode for free_page and memcg > comes in the next patches. > > This is a first step towards supporting BPF requirements in SLUB > and getting rid of bpf_mem_alloc. > That goal was discussed at LSFMM: https://lwn.net/Articles/974138/ > > Acked-by: Michal Hocko <mhocko@xxxxxxxx> > Acked-by: Vlastimil Babka <vbabka@xxxxxxx> > Acked-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> Reviewed-by: Shakeel Butt <shakeel.butt@xxxxxxxxx>