diff options
author | Martin Kelly <martin.kelly@crowdstrike.com> | 2023-09-25 14:50:36 -0700 |
---|---|---|
committer | Andrii Nakryiko <andrii.nakryiko@gmail.com> | 2023-10-02 11:17:48 -0700 |
commit | 2ad16b970a6e80cc82abe78386fa9257169d238e (patch) | |
tree | 0495f5bf3ca0b9d646a1e8eddfd42660c1b40dfb | |
parent | a20576f5f202103e0ae26de7751cf08ecd7231c1 (diff) | |
download | libbpf-2ad16b970a6e80cc82abe78386fa9257169d238e.tar.gz |
libbpf: Add ring__producer_pos, ring__consumer_pos
Add APIs to get the producer and consumer position for a given
ringbuffer.
Signed-off-by: Martin Kelly <martin.kelly@crowdstrike.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20230925215045.2375758-6-martin.kelly@crowdstrike.com
-rw-r--r-- | src/libbpf.h | 18 | ||||
-rw-r--r-- | src/libbpf.map | 2 | ||||
-rw-r--r-- | src/ringbuf.c | 14 |
3 files changed, 34 insertions, 0 deletions
diff --git a/src/libbpf.h b/src/libbpf.h index de3ef59..ab47017 100644 --- a/src/libbpf.h +++ b/src/libbpf.h @@ -1264,6 +1264,24 @@ LIBBPF_API int ring_buffer__epoll_fd(const struct ring_buffer *rb); LIBBPF_API struct ring *ring_buffer__ring(struct ring_buffer *rb, unsigned int idx); +/** + * @brief **ring__consumer_pos()** returns the current consumer position in the + * given ringbuffer. + * + * @param r A ringbuffer object. + * @return The current consumer position. + */ +LIBBPF_API unsigned long ring__consumer_pos(const struct ring *r); + +/** + * @brief **ring__producer_pos()** returns the current producer position in the + * given ringbuffer. + * + * @param r A ringbuffer object. + * @return The current producer position. + */ +LIBBPF_API unsigned long ring__producer_pos(const struct ring *r); + struct user_ring_buffer_opts { size_t sz; /* size of this struct, for forward/backward compatibility */ }; diff --git a/src/libbpf.map b/src/libbpf.map index 7a7370c..3bec002 100644 --- a/src/libbpf.map +++ b/src/libbpf.map @@ -400,5 +400,7 @@ LIBBPF_1.3.0 { bpf_program__attach_netfilter; bpf_program__attach_tcx; bpf_program__attach_uprobe_multi; + ring__consumer_pos; + ring__producer_pos; ring_buffer__ring; } LIBBPF_1.2.0; diff --git a/src/ringbuf.c b/src/ringbuf.c index efde453..d14a607 100644 --- a/src/ringbuf.c +++ b/src/ringbuf.c @@ -338,6 +338,20 @@ struct ring *ring_buffer__ring(struct ring_buffer *rb, unsigned int idx) return rb->rings[idx]; } +unsigned long ring__consumer_pos(const struct ring *r) +{ + /* Synchronizes with smp_store_release() in ringbuf_process_ring(). */ + return smp_load_acquire(r->consumer_pos); +} + +unsigned long ring__producer_pos(const struct ring *r) +{ + /* Synchronizes with smp_store_release() in __bpf_ringbuf_reserve() in + * the kernel. + */ + return smp_load_acquire(r->producer_pos); +} + static void user_ringbuf_unmap_ring(struct user_ring_buffer *rb) { if (rb->consumer_pos) { |