libbpf: Add ring__producer_pos, ring__consumer_pos
authorMartin Kelly <martin.kelly@crowdstrike.com>
Mon, 25 Sep 2023 21:50:36 +0000 (14:50 -0700)
committerAndrii Nakryiko <andrii@kernel.org>
Mon, 25 Sep 2023 23:22:42 +0000 (16:22 -0700)
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
tools/lib/bpf/libbpf.h
tools/lib/bpf/libbpf.map
tools/lib/bpf/ringbuf.c

index de3ef59b964119e2ddf5ba7cdac054e5bd5df69e..ab470179b7fea7430e8c13af15ea279fee85fd0d 100644 (file)
@@ -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 */
 };
index 7a7370c2bc25220659c3b0ece769d7d7339a5a24..3bec002449d5fe605aa844efe32e7ce56509a657 100644 (file)
@@ -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;
index efde453395b0be02ebb9b865dd4a1649b267a06d..d14a607f6b664e0584704bc11b93cc45b7eb12d2 100644 (file)
@@ -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) {