[PATCH bpf-next 0/3] bpf: arena: handle memory.max on fault-in with reclaim/OOM

From: Jiayuan Chen

Date: Mon Jul 27 2026 - 02:28:12 EST


Since commit e66fe1bc6d25 ("bpf: arena: Reintroduce memcg accounting"),
arena pages are charged to the memcg of the process that created the arena.
That accounting exposes two problems in the arena user page fault path.

1. The fault-in allocation runs under arena->spinlock, so it can only use the
non-blocking allocator, which never reclaims. Once memory.current is at
memory.max the allocation simply fails. Reaching memory.max is completely
normal for a healthy application - e.g. reading a large file fills
memory.current with page cache - so the process ends up killed for no real
reason.

2. That failure is turned into VM_FAULT_SIGSEGV, which is misleading: the
faulting address is a perfectly valid arena address. When we know it is an
out-of-memory condition we can return VM_FAULT_OOM and let the memcg OOM
path handle it properly.

Preallocate the page outside the lock (patch 2), the way do_anonymous_page()
does, so the allocation can sleep and go through reclaim and the OOM path.
This needs a sleepable allocator (patch 1), because can_alloc_pages() is a
conservative guess for BPF program context and always forces the non-blocking
allocator under PREEMPT_RT. patch 3 adds a selftest that faults an arena in
under a memory.max limit: without the fix the child gets SIGSEGV on a valid
address, with it the child is killed by the memcg OOM killer.

Jiayuan Chen (3):
bpf: Add a sleepable page allocator for map memory
bpf: arena: allocate the fault-in page outside the lock
selftests/bpf: Add a test for arena fault-in under memory.max

include/linux/bpf.h | 1 +
kernel/bpf/arena.c | 83 ++++++---
kernel/bpf/syscall.c | 21 ++-
.../selftests/bpf/prog_tests/arena_memcg.c | 158 ++++++++++++++++++
.../testing/selftests/bpf/progs/arena_memcg.c | 24 +++
5 files changed, 263 insertions(+), 24 deletions(-)
create mode 100644 tools/testing/selftests/bpf/prog_tests/arena_memcg.c
create mode 100644 tools/testing/selftests/bpf/progs/arena_memcg.c

--
2.43.0