Instead of always consuming all items from a ring buffer in a greedy way, allow to stop when the callback returns a value > 0. This allows to distinguish between an error condition and an intentional stop condition by returning a non-negative non-zero value from the ring buffer callback. This can be useful, for example, to consume just a single item from the ring buffer. Signed-off-by: Andrea Righi <andrea.righi@xxxxxxxxxxxxx> --- tools/lib/bpf/ringbuf.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/lib/bpf/ringbuf.c b/tools/lib/bpf/ringbuf.c index aacb64278a01..dd8908eb3204 100644 --- a/tools/lib/bpf/ringbuf.c +++ b/tools/lib/bpf/ringbuf.c @@ -265,6 +265,14 @@ static int64_t ringbuf_process_ring(struct ring *r) return err; } cnt++; + if (err > 0) { + /* update consumer pos and return the + * total amount of items consumed. + */ + smp_store_release(r->consumer_pos, + cons_pos); + goto done; + } } smp_store_release(r->consumer_pos, cons_pos); -- 2.43.0