xref: /f-stack/dpdk/app/test/test_ring.h (revision 2d9fd380)
1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606  * Copyright(c) 2019 Arm Limited
3*2d9fd380Sjfb8856606  */
4*2d9fd380Sjfb8856606 
5*2d9fd380Sjfb8856606 #include <rte_malloc.h>
6*2d9fd380Sjfb8856606 #include <rte_ring.h>
7*2d9fd380Sjfb8856606 #include <rte_ring_elem.h>
8*2d9fd380Sjfb8856606 
9*2d9fd380Sjfb8856606 /* API type to call
10*2d9fd380Sjfb8856606  * rte_ring_<sp/mp or sc/mc>_enqueue_<bulk/burst>
11*2d9fd380Sjfb8856606  * TEST_RING_THREAD_DEF - Uses configured SPSC/MPMC calls
12*2d9fd380Sjfb8856606  * TEST_RING_THREAD_SPSC - Calls SP or SC API
13*2d9fd380Sjfb8856606  * TEST_RING_THREAD_MPMC - Calls MP or MC API
14*2d9fd380Sjfb8856606  */
15*2d9fd380Sjfb8856606 #define TEST_RING_THREAD_DEF 1
16*2d9fd380Sjfb8856606 #define TEST_RING_THREAD_SPSC 2
17*2d9fd380Sjfb8856606 #define TEST_RING_THREAD_MPMC 4
18*2d9fd380Sjfb8856606 
19*2d9fd380Sjfb8856606 /* API type to call
20*2d9fd380Sjfb8856606  * TEST_RING_ELEM_SINGLE - Calls single element APIs
21*2d9fd380Sjfb8856606  * TEST_RING_ELEM_BULK - Calls bulk APIs
22*2d9fd380Sjfb8856606  * TEST_RING_ELEM_BURST - Calls burst APIs
23*2d9fd380Sjfb8856606  */
24*2d9fd380Sjfb8856606 #define TEST_RING_ELEM_SINGLE 8
25*2d9fd380Sjfb8856606 #define TEST_RING_ELEM_BULK 16
26*2d9fd380Sjfb8856606 #define TEST_RING_ELEM_BURST 32
27*2d9fd380Sjfb8856606 
28*2d9fd380Sjfb8856606 #define TEST_RING_IGNORE_API_TYPE ~0U
29*2d9fd380Sjfb8856606 
30*2d9fd380Sjfb8856606 /* This function is placed here as it is required for both
31*2d9fd380Sjfb8856606  * performance and functional tests.
32*2d9fd380Sjfb8856606  */
33*2d9fd380Sjfb8856606 static inline struct rte_ring*
test_ring_create(const char * name,int esize,unsigned int count,int socket_id,unsigned int flags)34*2d9fd380Sjfb8856606 test_ring_create(const char *name, int esize, unsigned int count,
35*2d9fd380Sjfb8856606 		int socket_id, unsigned int flags)
36*2d9fd380Sjfb8856606 {
37*2d9fd380Sjfb8856606 	/* Legacy queue APIs? */
38*2d9fd380Sjfb8856606 	if (esize == -1)
39*2d9fd380Sjfb8856606 		return rte_ring_create(name, count, socket_id, flags);
40*2d9fd380Sjfb8856606 	else
41*2d9fd380Sjfb8856606 		return rte_ring_create_elem(name, esize, count,
42*2d9fd380Sjfb8856606 						socket_id, flags);
43*2d9fd380Sjfb8856606 }
44*2d9fd380Sjfb8856606 
45*2d9fd380Sjfb8856606 static inline void*
test_ring_inc_ptr(void * obj,int esize,unsigned int n)46*2d9fd380Sjfb8856606 test_ring_inc_ptr(void *obj, int esize, unsigned int n)
47*2d9fd380Sjfb8856606 {
48*2d9fd380Sjfb8856606 	size_t sz;
49*2d9fd380Sjfb8856606 
50*2d9fd380Sjfb8856606 	sz = sizeof(void *);
51*2d9fd380Sjfb8856606 	/* Legacy queue APIs? */
52*2d9fd380Sjfb8856606 	if (esize != -1)
53*2d9fd380Sjfb8856606 		sz = esize;
54*2d9fd380Sjfb8856606 
55*2d9fd380Sjfb8856606 	return (void *)((uint32_t *)obj + (n * sz / sizeof(uint32_t)));
56*2d9fd380Sjfb8856606 }
57*2d9fd380Sjfb8856606 
58*2d9fd380Sjfb8856606 static inline void
test_ring_mem_copy(void * dst,void * const * src,int esize,unsigned int num)59*2d9fd380Sjfb8856606 test_ring_mem_copy(void *dst, void * const *src, int esize, unsigned int num)
60*2d9fd380Sjfb8856606 {
61*2d9fd380Sjfb8856606 	size_t sz;
62*2d9fd380Sjfb8856606 
63*2d9fd380Sjfb8856606 	sz = num * sizeof(void *);
64*2d9fd380Sjfb8856606 	if (esize != -1)
65*2d9fd380Sjfb8856606 		sz = esize * num;
66*2d9fd380Sjfb8856606 
67*2d9fd380Sjfb8856606 	memcpy(dst, src, sz);
68*2d9fd380Sjfb8856606 }
69*2d9fd380Sjfb8856606 
70*2d9fd380Sjfb8856606 /* Copy to the ring memory */
71*2d9fd380Sjfb8856606 static inline void
test_ring_copy_to(struct rte_ring_zc_data * zcd,void * const * src,int esize,unsigned int num)72*2d9fd380Sjfb8856606 test_ring_copy_to(struct rte_ring_zc_data *zcd, void * const *src, int esize,
73*2d9fd380Sjfb8856606 	unsigned int num)
74*2d9fd380Sjfb8856606 {
75*2d9fd380Sjfb8856606 	test_ring_mem_copy(zcd->ptr1, src, esize, zcd->n1);
76*2d9fd380Sjfb8856606 	if (zcd->n1 != num) {
77*2d9fd380Sjfb8856606 		if (esize == -1)
78*2d9fd380Sjfb8856606 			src = src + zcd->n1;
79*2d9fd380Sjfb8856606 		else
80*2d9fd380Sjfb8856606 			src = (void * const *)((const uint32_t *)src +
81*2d9fd380Sjfb8856606 					(zcd->n1 * esize / sizeof(uint32_t)));
82*2d9fd380Sjfb8856606 		test_ring_mem_copy(zcd->ptr2, src,
83*2d9fd380Sjfb8856606 					esize, num - zcd->n1);
84*2d9fd380Sjfb8856606 	}
85*2d9fd380Sjfb8856606 }
86*2d9fd380Sjfb8856606 
87*2d9fd380Sjfb8856606 /* Copy from the ring memory */
88*2d9fd380Sjfb8856606 static inline void
test_ring_copy_from(struct rte_ring_zc_data * zcd,void * dst,int esize,unsigned int num)89*2d9fd380Sjfb8856606 test_ring_copy_from(struct rte_ring_zc_data *zcd, void *dst, int esize,
90*2d9fd380Sjfb8856606 	unsigned int num)
91*2d9fd380Sjfb8856606 {
92*2d9fd380Sjfb8856606 	test_ring_mem_copy(dst, zcd->ptr1, esize, zcd->n1);
93*2d9fd380Sjfb8856606 
94*2d9fd380Sjfb8856606 	if (zcd->n1 != num) {
95*2d9fd380Sjfb8856606 		dst = test_ring_inc_ptr(dst, esize, zcd->n1);
96*2d9fd380Sjfb8856606 		test_ring_mem_copy(dst, zcd->ptr2, esize, num - zcd->n1);
97*2d9fd380Sjfb8856606 	}
98*2d9fd380Sjfb8856606 }
99*2d9fd380Sjfb8856606 
100*2d9fd380Sjfb8856606 static __rte_always_inline unsigned int
test_ring_enqueue(struct rte_ring * r,void ** obj,int esize,unsigned int n,unsigned int api_type)101*2d9fd380Sjfb8856606 test_ring_enqueue(struct rte_ring *r, void **obj, int esize, unsigned int n,
102*2d9fd380Sjfb8856606 			unsigned int api_type)
103*2d9fd380Sjfb8856606 {
104*2d9fd380Sjfb8856606 	/* Legacy queue APIs? */
105*2d9fd380Sjfb8856606 	if (esize == -1)
106*2d9fd380Sjfb8856606 		switch (api_type) {
107*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE):
108*2d9fd380Sjfb8856606 			return rte_ring_enqueue(r, *obj);
109*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_SINGLE):
110*2d9fd380Sjfb8856606 			return rte_ring_sp_enqueue(r, *obj);
111*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_SINGLE):
112*2d9fd380Sjfb8856606 			return rte_ring_mp_enqueue(r, *obj);
113*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BULK):
114*2d9fd380Sjfb8856606 			return rte_ring_enqueue_bulk(r, obj, n, NULL);
115*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BULK):
116*2d9fd380Sjfb8856606 			return rte_ring_sp_enqueue_bulk(r, obj, n, NULL);
117*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BULK):
118*2d9fd380Sjfb8856606 			return rte_ring_mp_enqueue_bulk(r, obj, n, NULL);
119*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST):
120*2d9fd380Sjfb8856606 			return rte_ring_enqueue_burst(r, obj, n, NULL);
121*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BURST):
122*2d9fd380Sjfb8856606 			return rte_ring_sp_enqueue_burst(r, obj, n, NULL);
123*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BURST):
124*2d9fd380Sjfb8856606 			return rte_ring_mp_enqueue_burst(r, obj, n, NULL);
125*2d9fd380Sjfb8856606 		default:
126*2d9fd380Sjfb8856606 			printf("Invalid API type\n");
127*2d9fd380Sjfb8856606 			return 0;
128*2d9fd380Sjfb8856606 		}
129*2d9fd380Sjfb8856606 	else
130*2d9fd380Sjfb8856606 		switch (api_type) {
131*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE):
132*2d9fd380Sjfb8856606 			return rte_ring_enqueue_elem(r, obj, esize);
133*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_SINGLE):
134*2d9fd380Sjfb8856606 			return rte_ring_sp_enqueue_elem(r, obj, esize);
135*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_SINGLE):
136*2d9fd380Sjfb8856606 			return rte_ring_mp_enqueue_elem(r, obj, esize);
137*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BULK):
138*2d9fd380Sjfb8856606 			return rte_ring_enqueue_bulk_elem(r, obj, esize, n,
139*2d9fd380Sjfb8856606 								NULL);
140*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BULK):
141*2d9fd380Sjfb8856606 			return rte_ring_sp_enqueue_bulk_elem(r, obj, esize, n,
142*2d9fd380Sjfb8856606 								NULL);
143*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BULK):
144*2d9fd380Sjfb8856606 			return rte_ring_mp_enqueue_bulk_elem(r, obj, esize, n,
145*2d9fd380Sjfb8856606 								NULL);
146*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST):
147*2d9fd380Sjfb8856606 			return rte_ring_enqueue_burst_elem(r, obj, esize, n,
148*2d9fd380Sjfb8856606 								NULL);
149*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BURST):
150*2d9fd380Sjfb8856606 			return rte_ring_sp_enqueue_burst_elem(r, obj, esize, n,
151*2d9fd380Sjfb8856606 								NULL);
152*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BURST):
153*2d9fd380Sjfb8856606 			return rte_ring_mp_enqueue_burst_elem(r, obj, esize, n,
154*2d9fd380Sjfb8856606 								NULL);
155*2d9fd380Sjfb8856606 		default:
156*2d9fd380Sjfb8856606 			printf("Invalid API type\n");
157*2d9fd380Sjfb8856606 			return 0;
158*2d9fd380Sjfb8856606 		}
159*2d9fd380Sjfb8856606 }
160*2d9fd380Sjfb8856606 
161*2d9fd380Sjfb8856606 static __rte_always_inline unsigned int
test_ring_dequeue(struct rte_ring * r,void ** obj,int esize,unsigned int n,unsigned int api_type)162*2d9fd380Sjfb8856606 test_ring_dequeue(struct rte_ring *r, void **obj, int esize, unsigned int n,
163*2d9fd380Sjfb8856606 			unsigned int api_type)
164*2d9fd380Sjfb8856606 {
165*2d9fd380Sjfb8856606 	/* Legacy queue APIs? */
166*2d9fd380Sjfb8856606 	if (esize == -1)
167*2d9fd380Sjfb8856606 		switch (api_type) {
168*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE):
169*2d9fd380Sjfb8856606 			return rte_ring_dequeue(r, obj);
170*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_SINGLE):
171*2d9fd380Sjfb8856606 			return rte_ring_sc_dequeue(r, obj);
172*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_SINGLE):
173*2d9fd380Sjfb8856606 			return rte_ring_mc_dequeue(r, obj);
174*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BULK):
175*2d9fd380Sjfb8856606 			return rte_ring_dequeue_bulk(r, obj, n, NULL);
176*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BULK):
177*2d9fd380Sjfb8856606 			return rte_ring_sc_dequeue_bulk(r, obj, n, NULL);
178*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BULK):
179*2d9fd380Sjfb8856606 			return rte_ring_mc_dequeue_bulk(r, obj, n, NULL);
180*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST):
181*2d9fd380Sjfb8856606 			return rte_ring_dequeue_burst(r, obj, n, NULL);
182*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BURST):
183*2d9fd380Sjfb8856606 			return rte_ring_sc_dequeue_burst(r, obj, n, NULL);
184*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BURST):
185*2d9fd380Sjfb8856606 			return rte_ring_mc_dequeue_burst(r, obj, n, NULL);
186*2d9fd380Sjfb8856606 		default:
187*2d9fd380Sjfb8856606 			printf("Invalid API type\n");
188*2d9fd380Sjfb8856606 			return 0;
189*2d9fd380Sjfb8856606 		}
190*2d9fd380Sjfb8856606 	else
191*2d9fd380Sjfb8856606 		switch (api_type) {
192*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE):
193*2d9fd380Sjfb8856606 			return rte_ring_dequeue_elem(r, obj, esize);
194*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_SINGLE):
195*2d9fd380Sjfb8856606 			return rte_ring_sc_dequeue_elem(r, obj, esize);
196*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_SINGLE):
197*2d9fd380Sjfb8856606 			return rte_ring_mc_dequeue_elem(r, obj, esize);
198*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BULK):
199*2d9fd380Sjfb8856606 			return rte_ring_dequeue_bulk_elem(r, obj, esize,
200*2d9fd380Sjfb8856606 								n, NULL);
201*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BULK):
202*2d9fd380Sjfb8856606 			return rte_ring_sc_dequeue_bulk_elem(r, obj, esize,
203*2d9fd380Sjfb8856606 								n, NULL);
204*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BULK):
205*2d9fd380Sjfb8856606 			return rte_ring_mc_dequeue_bulk_elem(r, obj, esize,
206*2d9fd380Sjfb8856606 								n, NULL);
207*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST):
208*2d9fd380Sjfb8856606 			return rte_ring_dequeue_burst_elem(r, obj, esize,
209*2d9fd380Sjfb8856606 								n, NULL);
210*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BURST):
211*2d9fd380Sjfb8856606 			return rte_ring_sc_dequeue_burst_elem(r, obj, esize,
212*2d9fd380Sjfb8856606 								n, NULL);
213*2d9fd380Sjfb8856606 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BURST):
214*2d9fd380Sjfb8856606 			return rte_ring_mc_dequeue_burst_elem(r, obj, esize,
215*2d9fd380Sjfb8856606 								n, NULL);
216*2d9fd380Sjfb8856606 		default:
217*2d9fd380Sjfb8856606 			printf("Invalid API type\n");
218*2d9fd380Sjfb8856606 			return 0;
219*2d9fd380Sjfb8856606 		}
220*2d9fd380Sjfb8856606 }
221*2d9fd380Sjfb8856606 
222*2d9fd380Sjfb8856606 /* This function is placed here as it is required for both
223*2d9fd380Sjfb8856606  * performance and functional tests.
224*2d9fd380Sjfb8856606  */
225*2d9fd380Sjfb8856606 static __rte_always_inline void *
test_ring_calloc(unsigned int rsize,int esize)226*2d9fd380Sjfb8856606 test_ring_calloc(unsigned int rsize, int esize)
227*2d9fd380Sjfb8856606 {
228*2d9fd380Sjfb8856606 	unsigned int sz;
229*2d9fd380Sjfb8856606 	void *p;
230*2d9fd380Sjfb8856606 
231*2d9fd380Sjfb8856606 	/* Legacy queue APIs? */
232*2d9fd380Sjfb8856606 	if (esize == -1)
233*2d9fd380Sjfb8856606 		sz = sizeof(void *);
234*2d9fd380Sjfb8856606 	else
235*2d9fd380Sjfb8856606 		sz = esize;
236*2d9fd380Sjfb8856606 
237*2d9fd380Sjfb8856606 	p = rte_zmalloc(NULL, rsize * sz, RTE_CACHE_LINE_SIZE);
238*2d9fd380Sjfb8856606 	if (p == NULL)
239*2d9fd380Sjfb8856606 		printf("Failed to allocate memory\n");
240*2d9fd380Sjfb8856606 
241*2d9fd380Sjfb8856606 	return p;
242*2d9fd380Sjfb8856606 }
243