Skip to content

Commit 4d22ea9

Browse files
Andrea Righianakryiko
authored andcommitted
libbpf: Add ring__consume_n / ring_buffer__consume_n
Introduce a new API to consume items from a ring buffer, limited to a specified amount, and return to the caller the actual number of items consumed. Signed-off-by: Andrea Righi <[email protected]> Signed-off-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/lkml/[email protected]/T Link: https://lore.kernel.org/bpf/[email protected]
1 parent 13e8125 commit 4d22ea9

File tree

3 files changed

+50
-3
lines changed

3 files changed

+50
-3
lines changed

tools/lib/bpf/libbpf.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,6 +1293,7 @@ LIBBPF_API int ring_buffer__add(struct ring_buffer *rb, int map_fd,
12931293
ring_buffer_sample_fn sample_cb, void *ctx);
12941294
LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms);
12951295
LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb);
1296+
LIBBPF_API int ring_buffer__consume_n(struct ring_buffer *rb, size_t n);
12961297
LIBBPF_API int ring_buffer__epoll_fd(const struct ring_buffer *rb);
12971298

12981299
/**
@@ -1367,6 +1368,17 @@ LIBBPF_API int ring__map_fd(const struct ring *r);
13671368
*/
13681369
LIBBPF_API int ring__consume(struct ring *r);
13691370

1371+
/**
1372+
* @brief **ring__consume_n()** consumes up to a requested amount of items from
1373+
* a ringbuffer without event polling.
1374+
*
1375+
* @param r A ringbuffer object.
1376+
* @param n Maximum amount of items to consume.
1377+
* @return The number of items consumed, or a negative number if any of the
1378+
* callbacks return an error.
1379+
*/
1380+
LIBBPF_API int ring__consume_n(struct ring *r, size_t n);
1381+
13701382
struct user_ring_buffer_opts {
13711383
size_t sz; /* size of this struct, for forward/backward compatibility */
13721384
};

tools/lib/bpf/libbpf.map

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,4 +418,7 @@ LIBBPF_1.4.0 {
418418
} LIBBPF_1.3.0;
419419

420420
LIBBPF_1.5.0 {
421+
global:
422+
ring__consume_n;
423+
ring_buffer__consume_n;
421424
} LIBBPF_1.4.0;

tools/lib/bpf/ringbuf.c

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,33 @@ static int64_t ringbuf_process_ring(struct ring *r, size_t n)
277277
return cnt;
278278
}
279279

280+
/* Consume available ring buffer(s) data without event polling, up to n
281+
* records.
282+
*
283+
* Returns number of records consumed across all registered ring buffers (or
284+
* n, whichever is less), or negative number if any of the callbacks return
285+
* error.
286+
*/
287+
int ring_buffer__consume_n(struct ring_buffer *rb, size_t n)
288+
{
289+
int64_t err, res = 0;
290+
int i;
291+
292+
for (i = 0; i < rb->ring_cnt; i++) {
293+
struct ring *ring = rb->rings[i];
294+
295+
err = ringbuf_process_ring(ring, n);
296+
if (err < 0)
297+
return libbpf_err(err);
298+
res += err;
299+
n -= err;
300+
301+
if (n == 0)
302+
break;
303+
}
304+
return res;
305+
}
306+
280307
/* Consume available ring buffer(s) data without event polling.
281308
* Returns number of records consumed across all registered ring buffers (or
282309
* INT_MAX, whichever is less), or negative number if any of the callbacks
@@ -376,17 +403,22 @@ int ring__map_fd(const struct ring *r)
376403
return r->map_fd;
377404
}
378405

379-
int ring__consume(struct ring *r)
406+
int ring__consume_n(struct ring *r, size_t n)
380407
{
381-
int64_t res;
408+
int res;
382409

383-
res = ringbuf_process_ring(r, INT_MAX);
410+
res = ringbuf_process_ring(r, n);
384411
if (res < 0)
385412
return libbpf_err(res);
386413

387414
return res > INT_MAX ? INT_MAX : res;
388415
}
389416

417+
int ring__consume(struct ring *r)
418+
{
419+
return ring__consume_n(r, INT_MAX);
420+
}
421+
390422
static void user_ringbuf_unmap_ring(struct user_ring_buffer *rb)
391423
{
392424
if (rb->consumer_pos) {

0 commit comments

Comments
 (0)