On Thu, Sep 14, 2023 at 4:12 PM Martin Kelly <martin.kelly@xxxxxxxxxxxxxxx> wrote: > > Add ring__consume to consume a single ringbuffer, analogous to > ring_buffer__consume. > > Signed-off-by: Martin Kelly <martin.kelly@xxxxxxxxxxxxxxx> > --- > tools/lib/bpf/libbpf.h | 10 ++++++++++ > tools/lib/bpf/libbpf.map | 1 + > tools/lib/bpf/ringbuf.c | 13 +++++++++++++ > 3 files changed, 24 insertions(+) > > diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h > index d2a237086c2c..861f8b6795e9 100644 > --- a/tools/lib/bpf/libbpf.h > +++ b/tools/lib/bpf/libbpf.h > @@ -1307,6 +1307,16 @@ LIBBPF_API size_t ring__size(const struct ring *r); > */ > LIBBPF_API int ring__map_fd(const struct ring *r); > > +/** > + * @brief **ring__consume()** consumes available ringbuffer data without event > + * polling. > + * > + * @param r A ring object. > + * @return The number of records consumed (or INT_MAX, whichever is less), or > + * a negative number if any of the callbacks return an error. > + */ > +LIBBPF_API int ring__consume(struct ring *r); > + > struct user_ring_buffer_opts { > size_t sz; /* size of this struct, for forward/backward compatibility */ > }; > diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map > index 13800b73c343..4b5124bb0e1a 100644 > --- a/tools/lib/bpf/libbpf.map > +++ b/tools/lib/bpf/libbpf.map > @@ -402,6 +402,7 @@ LIBBPF_1.3.0 { > bpf_program__attach_uprobe_multi; > ring_buffer__ring; > ring__avail_data_size; > + ring__consume; > ring__consumer_pos; > ring__map_fd; > ring__producer_pos; > diff --git a/tools/lib/bpf/ringbuf.c b/tools/lib/bpf/ringbuf.c > index 2dba2836d85b..b7ef003366d3 100644 > --- a/tools/lib/bpf/ringbuf.c > +++ b/tools/lib/bpf/ringbuf.c > @@ -365,6 +365,19 @@ int ring__map_fd(const struct ring *r) > return r->map_fd; > } > > +int ring__consume(struct ring *r) > +{ > + int64_t res; > + > + res = ringbuf_process_ring(r); > + if (res < 0) > + res = libbpf_err(res); it's a bit confusing to have libbpf_err() not within some return. Let's do `return libbpf_err(res);` here as the only error path? > + else if (res > INT_MAX) > + res = INT_MAX; > + > + return res; and here we can have `return res > INT_MAX ? INT_MAX : res;` > +} > + > static void user_ringbuf_unmap_ring(struct user_ring_buffer *rb) > { > if (rb->consumer_pos) { > -- > 2.34.1 >