[PATCH bpf-next v1 0/3] bpf, arena: keep range tree consistent on kmalloc_nolock failure
| Newsgroups | org.kernel.vger.bpf,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Yuan Chen <[email protected]> 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