DPDK 25.03.0-rc0
rte_event_ring.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2016-2017 Intel Corporation
3 * Copyright(c) 2019 Arm Limited
4 */
5
14#ifndef _RTE_EVENT_RING_
15#define _RTE_EVENT_RING_
16
17#include <stdint.h>
18
19#include <rte_common.h>
20#include <rte_ring.h>
21#include <rte_ring_elem.h>
22#include "rte_eventdev.h"
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27
28#define RTE_TAILQ_EVENT_RING_NAME "RTE_EVENT_RING"
29
38 struct rte_ring r;
39};
40
49static __rte_always_inline unsigned int
51{
52 return rte_ring_count(&r->r);
53}
54
64static __rte_always_inline unsigned int
66{
67 return rte_ring_free_count(&r->r);
68}
69
70
90static __rte_always_inline unsigned int
92 const struct rte_event *events,
93 unsigned int n, uint16_t *free_space)
94{
95 unsigned int num;
96 uint32_t space;
97
98 num = rte_ring_enqueue_bulk_elem(&r->r, events,
99 sizeof(struct rte_event), n,
100 &space);
101
102 if (free_space != NULL)
103 *free_space = space;
104
105 return num;
106}
107
126static __rte_always_inline unsigned int
128 struct rte_event *events,
129 unsigned int n, uint16_t *available)
130{
131 unsigned int num;
132 uint32_t remaining;
133
134 num = rte_ring_dequeue_bulk_elem(&r->r, events,
135 sizeof(struct rte_event), n,
136 &remaining);
137
138 if (available != NULL)
139 *available = remaining;
140
141 return num;
142}
143
164static __rte_always_inline unsigned int
166 const struct rte_event *events,
167 unsigned int n, uint16_t *free_space)
168{
169 unsigned int num;
170 uint32_t space;
171
172 num = rte_ring_enqueue_burst_elem(&r->r, events,
173 sizeof(struct rte_event), n,
174 &space);
175
176 if (free_space != NULL)
177 *free_space = space;
178
179 return num;
180}
181
200static __rte_always_inline unsigned int
202 struct rte_event *events,
203 unsigned int n, uint16_t *available)
204{
205 unsigned int num;
206 uint32_t remaining;
207
208 num = rte_ring_dequeue_burst_elem(&r->r, events,
209 sizeof(struct rte_event), n,
210 &remaining);
211
212 if (available != NULL)
213 *available = remaining;
214
215 return num;
216}
217
218/*
219 * Initializes an already-allocated ring structure
220 *
221 * @param r
222 * pointer to the ring memory to be initialized
223 * @param name
224 * name to be given to the ring
225 * @param count
226 * the number of elements to be stored in the ring. If the flag
227 * ``RING_F_EXACT_SZ`` is not set, this must be a power of 2, and the actual
228 * usable space in the ring will be ``count - 1`` entries. If the flag
229 * ``RING_F_EXACT_SZ`` is set, the this can be any value up to the ring size
230 * limit - 1, and the usable space will be exactly that requested.
231 * @param flags
232 * An OR of the following:
233 * - RING_F_SP_ENQ: If this flag is set, the default behavior when
234 * using ``rte_ring_enqueue()`` or ``rte_ring_enqueue_bulk()``
235 * is "single-producer". Otherwise, it is "multi-producers".
236 * - RING_F_SC_DEQ: If this flag is set, the default behavior when
237 * using ``rte_ring_dequeue()`` or ``rte_ring_dequeue_bulk()``
238 * is "single-consumer". Otherwise, it is "multi-consumers".
239 * - RING_F_EXACT_SZ: If this flag is set, the ``count`` parameter is to
240 * be taken as the exact usable size of the ring, and as such does not
241 * need to be a power of 2. The underlying ring memory should be a
242 * power-of-2 size greater than the count value.
243 * @return
244 * 0 on success, or a negative value on error.
245 */
246int
247rte_event_ring_init(struct rte_event_ring *r, const char *name,
248 unsigned int count, unsigned int flags);
249
250/*
251 * Create an event ring structure
252 *
253 * This function allocates memory and initializes an event ring inside that
254 * memory.
255 *
256 * @param name
257 * name to be given to the ring
258 * @param count
259 * the number of elements to be stored in the ring. If the flag
260 * ``RING_F_EXACT_SZ`` is not set, this must be a power of 2, and the actual
261 * usable space in the ring will be ``count - 1`` entries. If the flag
262 * ``RING_F_EXACT_SZ`` is set, the this can be any value up to the ring size
263 * limit - 1, and the usable space will be exactly that requested.
264 * @param socket_id
265 * The *socket_id* argument is the socket identifier in case of
266 * NUMA. The value can be *SOCKET_ID_ANY* if there is no NUMA
267 * constraint for the reserved zone.
268 * @param flags
269 * An OR of the following:
270 * - RING_F_SP_ENQ: If this flag is set, the default behavior when
271 * using ``rte_ring_enqueue()`` or ``rte_ring_enqueue_bulk()``
272 * is "single-producer". Otherwise, it is "multi-producers".
273 * - RING_F_SC_DEQ: If this flag is set, the default behavior when
274 * using ``rte_ring_dequeue()`` or ``rte_ring_dequeue_bulk()``
275 * is "single-consumer". Otherwise, it is "multi-consumers".
276 * - RING_F_EXACT_SZ: If this flag is set, the ``count`` parameter is to
277 * be taken as the exact usable size of the ring, and as such does not
278 * need to be a power of 2. The underlying ring memory should be a
279 * power-of-2 size greater than the count value.
280 * @return
281 * On success, the pointer to the new allocated ring. NULL on error with
282 * rte_errno set appropriately. Possible errno values include:
283 * - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
284 * - E_RTE_SECONDARY - function was called from a secondary process instance
285 * - EINVAL - count provided is not a power of 2
286 * - ENOSPC - the maximum number of memzones has already been allocated
287 * - EEXIST - a memzone with the same name already exists
288 * - ENOMEM - no appropriate memory area found in which to create memzone
289 */
290struct rte_event_ring *
291rte_event_ring_create(const char *name, unsigned int count, int socket_id,
292 unsigned int flags);
293
304struct rte_event_ring *
305rte_event_ring_lookup(const char *name);
306
314void
316
327static inline unsigned int
329{
330 return rte_ring_get_size(&r->r);
331}
332
341static inline unsigned int
343{
344 return rte_ring_get_capacity(&r->r);
345}
346
347#ifdef __cplusplus
348}
349#endif
350
351#endif
#define __rte_always_inline
Definition: rte_common.h:413
static __rte_always_inline unsigned int rte_event_ring_dequeue_bulk(struct rte_event_ring *r, struct rte_event *events, unsigned int n, uint16_t *available)
static __rte_always_inline unsigned int rte_event_ring_count(const struct rte_event_ring *r)
static __rte_always_inline unsigned int rte_event_ring_enqueue_bulk(struct rte_event_ring *r, const struct rte_event *events, unsigned int n, uint16_t *free_space)
static unsigned int rte_event_ring_get_size(const struct rte_event_ring *r)
static __rte_always_inline unsigned int rte_event_ring_free_count(const struct rte_event_ring *r)
static __rte_always_inline unsigned int rte_event_ring_enqueue_burst(struct rte_event_ring *r, const struct rte_event *events, unsigned int n, uint16_t *free_space)
static __rte_always_inline unsigned int rte_event_ring_dequeue_burst(struct rte_event_ring *r, struct rte_event *events, unsigned int n, uint16_t *available)
static unsigned int rte_event_ring_get_capacity(const struct rte_event_ring *r)
void rte_event_ring_free(struct rte_event_ring *r)
struct rte_event_ring * rte_event_ring_lookup(const char *name)
static unsigned int rte_ring_count(const struct rte_ring *r)
Definition: rte_ring.h:502
static unsigned int rte_ring_free_count(const struct rte_ring *r)
Definition: rte_ring.h:519
static unsigned int rte_ring_get_capacity(const struct rte_ring *r)
Definition: rte_ring.h:581
static unsigned int rte_ring_get_size(const struct rte_ring *r)
Definition: rte_ring.h:567
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_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_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)
char name[RTE_RING_NAMESIZE]