DPDK 22.11.0-rc2
rte_ring.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright (c) 2010-2020 Intel Corporation
4 * Copyright (c) 2007-2009 Kip Macy kmacy@freebsd.org
5 * All rights reserved.
6 * Derived from FreeBSD's bufring.h
7 * Used as BSD-3 Licensed with permission from Kip Macy.
8 */
9
10#ifndef _RTE_RING_H_
11#define _RTE_RING_H_
12
38#ifdef __cplusplus
39extern "C" {
40#endif
41
42#include <rte_ring_core.h>
43#include <rte_ring_elem.h>
44
59ssize_t rte_ring_get_memsize(unsigned int count);
60
121int rte_ring_init(struct rte_ring *r, const char *name, unsigned int count,
122 unsigned int flags);
123
188struct rte_ring *rte_ring_create(const char *name, unsigned int count,
189 int socket_id, unsigned int flags);
190
198void rte_ring_free(struct rte_ring *r);
199
208void rte_ring_dump(FILE *f, const struct rte_ring *r);
209
228static __rte_always_inline unsigned int
229rte_ring_mp_enqueue_bulk(struct rte_ring *r, void * const *obj_table,
230 unsigned int n, unsigned int *free_space)
231{
232 return rte_ring_mp_enqueue_bulk_elem(r, obj_table, sizeof(void *),
233 n, free_space);
234}
235
251static __rte_always_inline unsigned int
252rte_ring_sp_enqueue_bulk(struct rte_ring *r, void * const *obj_table,
253 unsigned int n, unsigned int *free_space)
254{
255 return rte_ring_sp_enqueue_bulk_elem(r, obj_table, sizeof(void *),
256 n, free_space);
257}
258
278static __rte_always_inline unsigned int
279rte_ring_enqueue_bulk(struct rte_ring *r, void * const *obj_table,
280 unsigned int n, unsigned int *free_space)
281{
282 return rte_ring_enqueue_bulk_elem(r, obj_table, sizeof(void *),
283 n, free_space);
284}
285
300static __rte_always_inline int
301rte_ring_mp_enqueue(struct rte_ring *r, void *obj)
302{
303 return rte_ring_mp_enqueue_elem(r, &obj, sizeof(void *));
304}
305
317static __rte_always_inline int
318rte_ring_sp_enqueue(struct rte_ring *r, void *obj)
319{
320 return rte_ring_sp_enqueue_elem(r, &obj, sizeof(void *));
321}
322
338static __rte_always_inline int
339rte_ring_enqueue(struct rte_ring *r, void *obj)
340{
341 return rte_ring_enqueue_elem(r, &obj, sizeof(void *));
342}
343
362static __rte_always_inline unsigned int
363rte_ring_mc_dequeue_bulk(struct rte_ring *r, void **obj_table,
364 unsigned int n, unsigned int *available)
365{
366 return rte_ring_mc_dequeue_bulk_elem(r, obj_table, sizeof(void *),
367 n, available);
368}
369
386static __rte_always_inline unsigned int
387rte_ring_sc_dequeue_bulk(struct rte_ring *r, void **obj_table,
388 unsigned int n, unsigned int *available)
389{
390 return rte_ring_sc_dequeue_bulk_elem(r, obj_table, sizeof(void *),
391 n, available);
392}
393
413static __rte_always_inline unsigned int
414rte_ring_dequeue_bulk(struct rte_ring *r, void **obj_table, unsigned int n,
415 unsigned int *available)
416{
417 return rte_ring_dequeue_bulk_elem(r, obj_table, sizeof(void *),
418 n, available);
419}
420
436static __rte_always_inline int
437rte_ring_mc_dequeue(struct rte_ring *r, void **obj_p)
438{
439 return rte_ring_mc_dequeue_elem(r, obj_p, sizeof(void *));
440}
441
454static __rte_always_inline int
455rte_ring_sc_dequeue(struct rte_ring *r, void **obj_p)
456{
457 return rte_ring_sc_dequeue_elem(r, obj_p, sizeof(void *));
458}
459
476static __rte_always_inline int
477rte_ring_dequeue(struct rte_ring *r, void **obj_p)
478{
479 return rte_ring_dequeue_elem(r, obj_p, sizeof(void *));
480}
481
493void
495
504static inline unsigned int
505rte_ring_count(const struct rte_ring *r)
506{
507 uint32_t prod_tail = r->prod.tail;
508 uint32_t cons_tail = r->cons.tail;
509 uint32_t count = (prod_tail - cons_tail) & r->mask;
510 return (count > r->capacity) ? r->capacity : count;
511}
512
521static inline unsigned int
523{
524 return r->capacity - rte_ring_count(r);
525}
526
536static inline int
537rte_ring_full(const struct rte_ring *r)
538{
539 return rte_ring_free_count(r) == 0;
540}
541
551static inline int
552rte_ring_empty(const struct rte_ring *r)
553{
554 uint32_t prod_tail = r->prod.tail;
555 uint32_t cons_tail = r->cons.tail;
556 return cons_tail == prod_tail;
557}
558
569static inline unsigned int
571{
572 return r->size;
573}
574
583static inline unsigned int
585{
586 return r->capacity;
587}
588
597static inline enum rte_ring_sync_type
599{
600 return r->prod.sync_type;
601}
602
611static inline int
613{
615}
616
625static inline enum rte_ring_sync_type
627{
628 return r->cons.sync_type;
629}
630
639static inline int
641{
643}
644
651void rte_ring_list_dump(FILE *f);
652
663struct rte_ring *rte_ring_lookup(const char *name);
664
683static __rte_always_inline unsigned int
684rte_ring_mp_enqueue_burst(struct rte_ring *r, void * const *obj_table,
685 unsigned int n, unsigned int *free_space)
686{
687 return rte_ring_mp_enqueue_burst_elem(r, obj_table, sizeof(void *),
688 n, free_space);
689}
690
706static __rte_always_inline unsigned int
707rte_ring_sp_enqueue_burst(struct rte_ring *r, void * const *obj_table,
708 unsigned int n, unsigned int *free_space)
709{
710 return rte_ring_sp_enqueue_burst_elem(r, obj_table, sizeof(void *),
711 n, free_space);
712}
713
733static __rte_always_inline unsigned int
734rte_ring_enqueue_burst(struct rte_ring *r, void * const *obj_table,
735 unsigned int n, unsigned int *free_space)
736{
737 return rte_ring_enqueue_burst_elem(r, obj_table, sizeof(void *),
738 n, free_space);
739}
740
761static __rte_always_inline unsigned int
762rte_ring_mc_dequeue_burst(struct rte_ring *r, void **obj_table,
763 unsigned int n, unsigned int *available)
764{
765 return rte_ring_mc_dequeue_burst_elem(r, obj_table, sizeof(void *),
766 n, available);
767}
768
786static __rte_always_inline unsigned int
787rte_ring_sc_dequeue_burst(struct rte_ring *r, void **obj_table,
788 unsigned int n, unsigned int *available)
789{
790 return rte_ring_sc_dequeue_burst_elem(r, obj_table, sizeof(void *),
791 n, available);
792}
793
813static __rte_always_inline unsigned int
814rte_ring_dequeue_burst(struct rte_ring *r, void **obj_table,
815 unsigned int n, unsigned int *available)
816{
817 return rte_ring_dequeue_burst_elem(r, obj_table, sizeof(void *),
818 n, available);
819}
820
821#ifdef __cplusplus
822}
823#endif
824
825#endif /* _RTE_RING_H_ */
#define __rte_always_inline
Definition: rte_common.h:255
static __rte_always_inline unsigned int rte_ring_sc_dequeue_burst(struct rte_ring *r, void **obj_table, unsigned int n, unsigned int *available)
Definition: rte_ring.h:787
static int rte_ring_full(const struct rte_ring *r)
Definition: rte_ring.h:537
void rte_ring_dump(FILE *f, const struct rte_ring *r)
ssize_t rte_ring_get_memsize(unsigned int count)
struct rte_ring * rte_ring_lookup(const char *name)
static __rte_always_inline unsigned int rte_ring_sc_dequeue_bulk(struct rte_ring *r, void **obj_table, unsigned int n, unsigned int *available)
Definition: rte_ring.h:387
int rte_ring_init(struct rte_ring *r, const char *name, unsigned int count, unsigned int flags)
static unsigned int rte_ring_count(const struct rte_ring *r)
Definition: rte_ring.h:505
static unsigned int rte_ring_free_count(const struct rte_ring *r)
Definition: rte_ring.h:522
static __rte_always_inline unsigned int rte_ring_mp_enqueue_burst(struct rte_ring *r, void *const *obj_table, unsigned int n, unsigned int *free_space)
Definition: rte_ring.h:684
static __rte_always_inline unsigned int rte_ring_sp_enqueue_burst(struct rte_ring *r, void *const *obj_table, unsigned int n, unsigned int *free_space)
Definition: rte_ring.h:707
static __rte_always_inline unsigned int rte_ring_mc_dequeue_bulk(struct rte_ring *r, void **obj_table, unsigned int n, unsigned int *available)
Definition: rte_ring.h:363
static __rte_always_inline unsigned int rte_ring_dequeue_bulk(struct rte_ring *r, void **obj_table, unsigned int n, unsigned int *available)
Definition: rte_ring.h:414
static __rte_always_inline unsigned int rte_ring_mc_dequeue_burst(struct rte_ring *r, void **obj_table, unsigned int n, unsigned int *available)
Definition: rte_ring.h:762
void rte_ring_free(struct rte_ring *r)
static __rte_always_inline int rte_ring_mp_enqueue(struct rte_ring *r, void *obj)
Definition: rte_ring.h:301
void rte_ring_list_dump(FILE *f)
static __rte_always_inline unsigned int rte_ring_enqueue_burst(struct rte_ring *r, void *const *obj_table, unsigned int n, unsigned int *free_space)
Definition: rte_ring.h:734
static __rte_always_inline int rte_ring_dequeue(struct rte_ring *r, void **obj_p)
Definition: rte_ring.h:477
struct rte_ring * rte_ring_create(const char *name, unsigned int count, int socket_id, unsigned int flags)
static int rte_ring_is_prod_single(const struct rte_ring *r)
Definition: rte_ring.h:612
static __rte_always_inline unsigned int rte_ring_dequeue_burst(struct rte_ring *r, void **obj_table, unsigned int n, unsigned int *available)
Definition: rte_ring.h:814
static int rte_ring_is_cons_single(const struct rte_ring *r)
Definition: rte_ring.h:640
static __rte_always_inline int rte_ring_enqueue(struct rte_ring *r, void *obj)
Definition: rte_ring.h:339
static unsigned int rte_ring_get_capacity(const struct rte_ring *r)
Definition: rte_ring.h:584
static __rte_always_inline int rte_ring_mc_dequeue(struct rte_ring *r, void **obj_p)
Definition: rte_ring.h:437
static unsigned int rte_ring_get_size(const struct rte_ring *r)
Definition: rte_ring.h:570
static __rte_always_inline unsigned int rte_ring_enqueue_bulk(struct rte_ring *r, void *const *obj_table, unsigned int n, unsigned int *free_space)
Definition: rte_ring.h:279
static enum rte_ring_sync_type rte_ring_get_cons_sync_type(const struct rte_ring *r)
Definition: rte_ring.h:626
static int rte_ring_empty(const struct rte_ring *r)
Definition: rte_ring.h:552
static enum rte_ring_sync_type rte_ring_get_prod_sync_type(const struct rte_ring *r)
Definition: rte_ring.h:598
static __rte_always_inline unsigned int rte_ring_mp_enqueue_bulk(struct rte_ring *r, void *const *obj_table, unsigned int n, unsigned int *free_space)
Definition: rte_ring.h:229
void rte_ring_reset(struct rte_ring *r)
static __rte_always_inline int rte_ring_sc_dequeue(struct rte_ring *r, void **obj_p)
Definition: rte_ring.h:455
static __rte_always_inline unsigned int rte_ring_sp_enqueue_bulk(struct rte_ring *r, void *const *obj_table, unsigned int n, unsigned int *free_space)
Definition: rte_ring.h:252
static __rte_always_inline int rte_ring_sp_enqueue(struct rte_ring *r, void *obj)
Definition: rte_ring.h:318
rte_ring_sync_type
Definition: rte_ring_core.h:56
@ RTE_RING_SYNC_ST
Definition: rte_ring_core.h:58
static __rte_always_inline int rte_ring_sp_enqueue_elem(struct rte_ring *r, void *obj, unsigned int esize)
static __rte_always_inline int rte_ring_mc_dequeue_elem(struct rte_ring *r, void *obj_p, unsigned int esize)
static __rte_always_inline unsigned int rte_ring_sc_dequeue_burst_elem(struct rte_ring *r, void *obj_table, unsigned int esize, unsigned int n, unsigned int *available)
static __rte_always_inline unsigned int rte_ring_dequeue_bulk_elem(struct rte_ring *r, void *obj_table, unsigned int esize, unsigned int n, unsigned int *available)
static __rte_always_inline unsigned int rte_ring_mc_dequeue_bulk_elem(struct rte_ring *r, void *obj_table, unsigned int esize, unsigned int n, unsigned int *available)
static __rte_always_inline int rte_ring_enqueue_elem(struct rte_ring *r, void *obj, unsigned int esize)
static __rte_always_inline int rte_ring_sc_dequeue_elem(struct rte_ring *r, void *obj_p, unsigned int esize)
static __rte_always_inline int rte_ring_dequeue_elem(struct rte_ring *r, void *obj_p, unsigned int esize)
static __rte_always_inline unsigned int rte_ring_mc_dequeue_burst_elem(struct rte_ring *r, void *obj_table, unsigned int esize, unsigned int n, unsigned int *available)
static __rte_always_inline unsigned int rte_ring_enqueue_bulk_elem(struct rte_ring *r, const void *obj_table, unsigned int esize, unsigned int n, unsigned int *free_space)
static __rte_always_inline int rte_ring_mp_enqueue_elem(struct rte_ring *r, void *obj, unsigned int esize)
static __rte_always_inline unsigned int rte_ring_sc_dequeue_bulk_elem(struct rte_ring *r, void *obj_table, unsigned int esize, unsigned int n, unsigned int *available)
static __rte_always_inline unsigned int rte_ring_mp_enqueue_bulk_elem(struct rte_ring *r, const void *obj_table, unsigned int esize, unsigned int n, unsigned int *free_space)
static __rte_always_inline unsigned int rte_ring_mp_enqueue_burst_elem(struct rte_ring *r, const void *obj_table, unsigned int esize, unsigned int n, unsigned int *free_space)
static __rte_always_inline unsigned int rte_ring_sp_enqueue_burst_elem(struct rte_ring *r, const void *obj_table, unsigned int esize, unsigned int n, unsigned int *free_space)
static __rte_always_inline unsigned int rte_ring_dequeue_burst_elem(struct rte_ring *r, void *obj_table, unsigned int esize, unsigned int n, unsigned int *available)
static __rte_always_inline unsigned int rte_ring_enqueue_burst_elem(struct rte_ring *r, const void *obj_table, unsigned int esize, unsigned int n, unsigned int *free_space)
static __rte_always_inline unsigned int rte_ring_sp_enqueue_bulk_elem(struct rte_ring *r, const void *obj_table, unsigned int esize, unsigned int n, unsigned int *free_space)
enum rte_ring_sync_type sync_type
Definition: rte_ring_core.h:74
volatile uint32_t tail
Definition: rte_ring_core.h:70
uint32_t capacity
uint32_t size
uint32_t mask