]> git.proxmox.com Git - ceph.git/blame - ceph/src/seastar/dpdk/drivers/mempool/ring/rte_mempool_ring.c
import 15.2.0 Octopus source
[ceph.git] / ceph / src / seastar / dpdk / drivers / mempool / ring / rte_mempool_ring.c
CommitLineData
9f95a23c
TL
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2016 Intel Corporation
7c673cae
FG
3 */
4
5#include <stdio.h>
6#include <string.h>
7
8#include <rte_errno.h>
9#include <rte_ring.h>
10#include <rte_mempool.h>
11
12static int
13common_ring_mp_enqueue(struct rte_mempool *mp, void * const *obj_table,
14 unsigned n)
15{
11fdf7f2
TL
16 return rte_ring_mp_enqueue_bulk(mp->pool_data,
17 obj_table, n, NULL) == 0 ? -ENOBUFS : 0;
7c673cae
FG
18}
19
20static int
21common_ring_sp_enqueue(struct rte_mempool *mp, void * const *obj_table,
22 unsigned n)
23{
11fdf7f2
TL
24 return rte_ring_sp_enqueue_bulk(mp->pool_data,
25 obj_table, n, NULL) == 0 ? -ENOBUFS : 0;
7c673cae
FG
26}
27
28static int
29common_ring_mc_dequeue(struct rte_mempool *mp, void **obj_table, unsigned n)
30{
11fdf7f2
TL
31 return rte_ring_mc_dequeue_bulk(mp->pool_data,
32 obj_table, n, NULL) == 0 ? -ENOBUFS : 0;
7c673cae
FG
33}
34
35static int
36common_ring_sc_dequeue(struct rte_mempool *mp, void **obj_table, unsigned n)
37{
11fdf7f2
TL
38 return rte_ring_sc_dequeue_bulk(mp->pool_data,
39 obj_table, n, NULL) == 0 ? -ENOBUFS : 0;
7c673cae
FG
40}
41
42static unsigned
43common_ring_get_count(const struct rte_mempool *mp)
44{
45 return rte_ring_count(mp->pool_data);
46}
47
48
49static int
50common_ring_alloc(struct rte_mempool *mp)
51{
52 int rg_flags = 0, ret;
53 char rg_name[RTE_RING_NAMESIZE];
54 struct rte_ring *r;
55
56 ret = snprintf(rg_name, sizeof(rg_name),
57 RTE_MEMPOOL_MZ_FORMAT, mp->name);
58 if (ret < 0 || ret >= (int)sizeof(rg_name)) {
59 rte_errno = ENAMETOOLONG;
60 return -rte_errno;
61 }
62
63 /* ring flags */
64 if (mp->flags & MEMPOOL_F_SP_PUT)
65 rg_flags |= RING_F_SP_ENQ;
66 if (mp->flags & MEMPOOL_F_SC_GET)
67 rg_flags |= RING_F_SC_DEQ;
68
69 /*
70 * Allocate the ring that will be used to store objects.
71 * Ring functions will return appropriate errors if we are
72 * running as a secondary process etc., so no checks made
73 * in this function for that condition.
74 */
75 r = rte_ring_create(rg_name, rte_align32pow2(mp->size + 1),
76 mp->socket_id, rg_flags);
77 if (r == NULL)
78 return -rte_errno;
79
80 mp->pool_data = r;
81
82 return 0;
83}
84
85static void
86common_ring_free(struct rte_mempool *mp)
87{
88 rte_ring_free(mp->pool_data);
89}
90
91/*
92 * The following 4 declarations of mempool ops structs address
93 * the need for the backward compatible mempool handlers for
94 * single/multi producers and single/multi consumers as dictated by the
95 * flags provided to the rte_mempool_create function
96 */
97static const struct rte_mempool_ops ops_mp_mc = {
98 .name = "ring_mp_mc",
99 .alloc = common_ring_alloc,
100 .free = common_ring_free,
101 .enqueue = common_ring_mp_enqueue,
102 .dequeue = common_ring_mc_dequeue,
103 .get_count = common_ring_get_count,
104};
105
106static const struct rte_mempool_ops ops_sp_sc = {
107 .name = "ring_sp_sc",
108 .alloc = common_ring_alloc,
109 .free = common_ring_free,
110 .enqueue = common_ring_sp_enqueue,
111 .dequeue = common_ring_sc_dequeue,
112 .get_count = common_ring_get_count,
113};
114
115static const struct rte_mempool_ops ops_mp_sc = {
116 .name = "ring_mp_sc",
117 .alloc = common_ring_alloc,
118 .free = common_ring_free,
119 .enqueue = common_ring_mp_enqueue,
120 .dequeue = common_ring_sc_dequeue,
121 .get_count = common_ring_get_count,
122};
123
124static const struct rte_mempool_ops ops_sp_mc = {
125 .name = "ring_sp_mc",
126 .alloc = common_ring_alloc,
127 .free = common_ring_free,
128 .enqueue = common_ring_sp_enqueue,
129 .dequeue = common_ring_mc_dequeue,
130 .get_count = common_ring_get_count,
131};
132
133MEMPOOL_REGISTER_OPS(ops_mp_mc);
134MEMPOOL_REGISTER_OPS(ops_sp_sc);
135MEMPOOL_REGISTER_OPS(ops_mp_sc);
136MEMPOOL_REGISTER_OPS(ops_sp_mc);