Re: [PATCH] bpf: Clear rb node linkage when freeing bpf_rb_root

From: bot+bpf-ci

Date: Mon Jun 01 2026 - 02:45:38 EST


> diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
> index 9ca195104667..46e8eada463b 100644
> --- a/kernel/bpf/helpers.c
> +++ b/kernel/bpf/helpers.c
> @@ -2307,22 +2307,30 @@ void bpf_rb_root_free(const struct btf_field *field, void *rb_root,
> {
> struct rb_root_cached orig_root, *root = rb_root;
> struct rb_node *pos, *n;
> - void *obj;
>
> BUILD_BUG_ON(sizeof(struct rb_root_cached) > sizeof(struct bpf_rb_root));
> BUILD_BUG_ON(__alignof__(struct rb_root_cached) > __alignof__(struct bpf_rb_root));
>
> __bpf_spin_lock_irqsave(spin_lock);
> orig_root = *root;
> + bpf_rbtree_postorder_for_each_entry_safe(pos, n, &orig_root.rb_root) {
> + struct bpf_rb_node_kern *node;
> +
> + node = rb_entry(pos, struct bpf_rb_node_kern, rb_node);
> + WRITE_ONCE(node->owner, BPF_PTR_POISON);
> + }
> *root = RB_ROOT_CACHED;
> __bpf_spin_unlock_irqrestore(spin_lock);

Since there is no verifier-enforced limit on the number of nodes in a BPF
rbtree, could this O(N) post-order traversal trigger latency spikes, RCU
stalls, or NMI watchdog lockups?

This loop runs inside the __bpf_spin_lock_irqsave() critical section, which
disables local interrupts.

Additionally, since rb_first_postorder() and rb_next_postorder() are exported
and traceable, if an fentry/fexit BPF program is attached to them and attempts
to acquire the same bpf_spin_lock, will it cause a hard deadlock?

(from review discussion at
https://lore.kernel.org/bpf/20260601061503.EFD881F00898@xxxxxxxxxxxxxxx/)

[ ... ]


---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md

CI run summary: https://github.com/kernel-patches/bpf/actions/runs/26738658508