Re: [PATCH bpf-next] libbpf: Expose libbpf ringbufer epoll_fd

From: Andrii Nakryiko
Date: Fri Dec 11 2020 - 14:46:34 EST


On Fri, Dec 11, 2020 at 10:58 AM Brendan Jackman <jackmanb@xxxxxxxxxx> wrote:
>
> This allows the user to do their own manual polling in more
> complicated setups.
>
> Signed-off-by: Brendan Jackman <jackmanb@xxxxxxxxxx>
> ---

perf_buffer has it, so it's good for consistency. In practice, though,
I'd expect anyone who needs more complicated polling to use ring buf's
map FD directly on their instance of epoll. Doesn't that work for you?

Regardless, though, you need to add the API into libbpf.map file first.


> tools/lib/bpf/libbpf.h | 1 +
> tools/lib/bpf/ringbuf.c | 6 ++++++
> 2 files changed, 7 insertions(+)
>
> diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
> index 6909ee81113a..cde07f64771e 100644
> --- a/tools/lib/bpf/libbpf.h
> +++ b/tools/lib/bpf/libbpf.h
> @@ -536,6 +536,7 @@ LIBBPF_API int ring_buffer__add(struct ring_buffer *rb, int map_fd,
> ring_buffer_sample_fn sample_cb, void *ctx);
> LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms);
> LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb);
> +LIBBPF_API int ring_buffer__epoll_fd(struct ring_buffer *rb);
>
> /* Perf buffer APIs */
> struct perf_buffer;
> diff --git a/tools/lib/bpf/ringbuf.c b/tools/lib/bpf/ringbuf.c
> index 5c6522c89af1..45a36648b403 100644
> --- a/tools/lib/bpf/ringbuf.c
> +++ b/tools/lib/bpf/ringbuf.c
> @@ -282,3 +282,9 @@ int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms)
> }
> return cnt < 0 ? -errno : res;
> }
> +
> +/* Get an fd that can be used to sleep until data is available in the ring(s) */
> +int ring_buffer__epoll_fd(struct ring_buffer *rb)
> +{
> + return rb->epoll_fd;
> +}
>
> base-commit: b4fe9fec51ef48011f11c2da4099f0b530449c92
> --
> 2.29.2.576.ga3fc446d84-goog
>