Fix several correctness issues in libbpf's ring buffer consumer. A zero record bound currently consumes one record. A NULL callback is accepted during manager construction but crashes when callback-based consumption reaches the ring. Position counters stop consumption after wrapping because they are compared by magnitude.
The consumer can also miss a readiness notification after publishing its position and checking for new data without a full StoreLoad barrier. Use compiler atomics and add the missing barrier, including when retrying a busy record after publishing earlier records. Callback traversal does not follow the overwrite position maintained by BPF_F_RB_OVERWRITE maps. Reject callback consumption of those maps, as discussed here: https://lore.kernel.org/bpf/CAEf4Bzaq5drHWChXoRBnrmkb6reAsSVj8r=ubyfsup31fma...@mail.gmail.com/ Andrew Werner found the position-wrap and missed-wakeup failures while implementing Aya's ring buffer reader. Aya's original implementation contains the equality reasoning and edge-triggered regression test: https://github.com/aya-rs/aya/commit/e2cf734490bc188bcedb1eac92d23d81123e42cd Aya later corrected the consumer ordering with the same explicit fence: https://github.com/aya-rs/aya/commit/7277a57ea8cdb74918d3096a4b22b6d814481973 Assisted-by: Codex:gpt-5.5 Signed-off-by: Tamir Duberstein <[email protected]> --- Tamir Duberstein (6): libbpf: ringbuf: Honor zero consume bounds libbpf: ringbuf: Prevent NULL callback crash libbpf: ringbuf: Handle position counter wrap libbpf: ringbuf: Use compiler atomics libbpf: ringbuf: Prevent missed wakeups libbpf: ringbuf: Reject overwrite callback use tools/lib/bpf/libbpf.h | 34 +++- tools/lib/bpf/ringbuf.c | 84 +++++++-- tools/testing/selftests/bpf/prog_tests/ringbuf.c | 229 +++++++++++++++++++++++ 3 files changed, 323 insertions(+), 24 deletions(-) --- base-commit: e7ae89a0c97ce2b68b0983cd01eda67cf373517d change-id: 20260613-bpf-ringbuf-fixes-e9a8b3c6125b Best regards, -- Tamir Duberstein <[email protected]>

