[PATCH bpf-next v1 0/3] bpf, arena: keep range tree consistent on kmalloc_nolock failure

From: chenyuan_fl

Date: Wed Aug 05 2026 - 23:06:59 EST


From: Yuan Chen <chenyuan@xxxxxxxxxx>

The arena range tree tracks free arena ranges. range_tree_clear() and
range_tree_set() can fail when kmalloc_nolock() cannot allocate a node,
but both functions modified the tree before that allocation. On
failure they returned -ENOMEM with part of the affected range already
removed from the tree, permanently losing those arena slots: they could
neither be allocated nor freed again.

Patch 1 pre-allocates the split node in range_tree_clear() so a failure
leaves the tree unmodified. Patch 2 does the same for range_tree_set(),
allocating the new node only when the range has no adjacent free range
on either side. Patch 3 makes arena_free_pages() and
arena_free_worker() check the range_tree_set() return value and skip
the free when the tree update fails, instead of unmapping and freeing
pages the tree still considers allocated.

The failure path requires kmalloc_nolock() to fail under memory
pressure, which is not feasible to trigger deterministically in a
selftest, so no regression test is included.

Yuan Chen (3):
bpf, arena: fix range_tree_clear inconsistency on kmalloc_nolock
failure
bpf, arena: fix range_tree_set inconsistency on kmalloc_nolock failure
bpf, arena: check range_tree_set return in arena_free_pages and
arena_free_worker

kernel/bpf/arena.c | 17 +++++++++---
kernel/bpf/range_tree.c | 60 ++++++++++++++++++++++++++++++-----------
2 files changed, 58 insertions(+), 19 deletions(-)


base-commit: 11c1e836710dcba03e50454a4eedfdbaf8d3050e
--
2.54.0