[PATCH 0/3] bpf: Make sleepable arena paths use sleepable alloc_pages
Emil Tsalapatis <[email protected]>
| Newsgroups | org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
The arena_alloc_pages() call takes a sleepable argument based on whether its caller is a sleepable BPF function. This flag, along with the context the kfunc is called in, decides whether the call will try to fulfill the allocation using the regular or the _nolock variant of the alloc_pages API, by means of bpf_map_alloc_pages(). However, the arena_alloc_pages() call currently only makes allocations inside an IRQ-disabled critical section. This forces all allocations to use the _nolock() API, which may eagerly fail where the regular variant would eventually succeed. There have been reports of this happening for sched-ext schedulers. Restructure arena_alloc_pages() to use the _nolock() page allocation API only when necessary. This requires moving allocations outside of the spinlock critical section for sleepable calls, which in turn requires slightly different logic in the allocation path. Make a separate sleepable code path that implements this logic. Signed-off-by: Emil Tsalapatis <[email protected]> Emil Tsalapatis (3): bpf: Factor out nonsleepable arena allocation logic bpf: Add sleepable arena page allocation path selftests/bpf: Test large allocations for both sleepable/nonsleepable arena users include/linux/bpf.h | 6 + kernel/bpf/arena.c | 188 +++++++++++++----- kernel/bpf/syscall.c | 8 +- .../bpf/progs/verifier_arena_large.c | 27 ++- 4 files changed, 175 insertions(+), 54 deletions(-) -- 2.54.0