xref: /dpdk/app/test/test_ring.h (revision a4cb5461cf0edc92cc63e6122edfa9c974e78e46)
1a9fe1523SHonnappa Nagarahalli /* SPDX-License-Identifier: BSD-3-Clause
2a9fe1523SHonnappa Nagarahalli  * Copyright(c) 2019 Arm Limited
3a9fe1523SHonnappa Nagarahalli  */
4a9fe1523SHonnappa Nagarahalli 
5a9fe1523SHonnappa Nagarahalli #include <rte_malloc.h>
6*a4cb5461SPaul Szczepanek #include <rte_memcpy.h>
7*a4cb5461SPaul Szczepanek #include <rte_ptr_compress.h>
8a9fe1523SHonnappa Nagarahalli #include <rte_ring.h>
9a9fe1523SHonnappa Nagarahalli #include <rte_ring_elem.h>
10a9fe1523SHonnappa Nagarahalli 
11a9fe1523SHonnappa Nagarahalli /* API type to call
12a9fe1523SHonnappa Nagarahalli  * rte_ring_<sp/mp or sc/mc>_enqueue_<bulk/burst>
13a9fe1523SHonnappa Nagarahalli  * TEST_RING_THREAD_DEF - Uses configured SPSC/MPMC calls
14a9fe1523SHonnappa Nagarahalli  * TEST_RING_THREAD_SPSC - Calls SP or SC API
15a9fe1523SHonnappa Nagarahalli  * TEST_RING_THREAD_MPMC - Calls MP or MC API
16a9fe1523SHonnappa Nagarahalli  */
17a9fe1523SHonnappa Nagarahalli #define TEST_RING_THREAD_DEF 1
18a9fe1523SHonnappa Nagarahalli #define TEST_RING_THREAD_SPSC 2
19a9fe1523SHonnappa Nagarahalli #define TEST_RING_THREAD_MPMC 4
20a9fe1523SHonnappa Nagarahalli 
21a9fe1523SHonnappa Nagarahalli /* API type to call
22a9fe1523SHonnappa Nagarahalli  * TEST_RING_ELEM_SINGLE - Calls single element APIs
23a9fe1523SHonnappa Nagarahalli  * TEST_RING_ELEM_BULK - Calls bulk APIs
24a9fe1523SHonnappa Nagarahalli  * TEST_RING_ELEM_BURST - Calls burst APIs
25a9fe1523SHonnappa Nagarahalli  */
26a9fe1523SHonnappa Nagarahalli #define TEST_RING_ELEM_SINGLE 8
27a9fe1523SHonnappa Nagarahalli #define TEST_RING_ELEM_BULK 16
28a9fe1523SHonnappa Nagarahalli #define TEST_RING_ELEM_BURST 32
29a9fe1523SHonnappa Nagarahalli 
30*a4cb5461SPaul Szczepanek #define TEST_RING_ELEM_BURST_ZC 64
31*a4cb5461SPaul Szczepanek #define TEST_RING_ELEM_BURST_ZC_COMPRESS_PTR_16 128
32*a4cb5461SPaul Szczepanek #define TEST_RING_ELEM_BURST_ZC_COMPRESS_PTR_32 256
33*a4cb5461SPaul Szczepanek 
34a9fe1523SHonnappa Nagarahalli #define TEST_RING_IGNORE_API_TYPE ~0U
35a9fe1523SHonnappa Nagarahalli 
36a9fe1523SHonnappa Nagarahalli /* This function is placed here as it is required for both
37a9fe1523SHonnappa Nagarahalli  * performance and functional tests.
38a9fe1523SHonnappa Nagarahalli  */
39a9fe1523SHonnappa Nagarahalli static inline struct rte_ring*
test_ring_create(const char * name,int esize,unsigned int count,int socket_id,unsigned int flags)40a9fe1523SHonnappa Nagarahalli test_ring_create(const char *name, int esize, unsigned int count,
41a9fe1523SHonnappa Nagarahalli 		int socket_id, unsigned int flags)
42a9fe1523SHonnappa Nagarahalli {
43a9fe1523SHonnappa Nagarahalli 	/* Legacy queue APIs? */
4431354c76SHonnappa Nagarahalli 	if (esize == -1)
4531354c76SHonnappa Nagarahalli 		return rte_ring_create(name, count, socket_id, flags);
46a9fe1523SHonnappa Nagarahalli 	else
4731354c76SHonnappa Nagarahalli 		return rte_ring_create_elem(name, esize, count,
4831354c76SHonnappa Nagarahalli 						socket_id, flags);
49a9fe1523SHonnappa Nagarahalli }
50a9fe1523SHonnappa Nagarahalli 
5183342a13SHonnappa Nagarahalli static inline void*
test_ring_inc_ptr(void * obj,int esize,unsigned int n)5283342a13SHonnappa Nagarahalli test_ring_inc_ptr(void *obj, int esize, unsigned int n)
5383342a13SHonnappa Nagarahalli {
5483342a13SHonnappa Nagarahalli 	size_t sz;
5583342a13SHonnappa Nagarahalli 
5683342a13SHonnappa Nagarahalli 	sz = sizeof(void *);
5783342a13SHonnappa Nagarahalli 	/* Legacy queue APIs? */
5883342a13SHonnappa Nagarahalli 	if (esize != -1)
5983342a13SHonnappa Nagarahalli 		sz = esize;
6083342a13SHonnappa Nagarahalli 
6183342a13SHonnappa Nagarahalli 	return (void *)((uint32_t *)obj + (n * sz / sizeof(uint32_t)));
6283342a13SHonnappa Nagarahalli }
6383342a13SHonnappa Nagarahalli 
6483342a13SHonnappa Nagarahalli static inline void
test_ring_mem_copy(void * dst,void * const * src,int esize,unsigned int num)6583342a13SHonnappa Nagarahalli test_ring_mem_copy(void *dst, void * const *src, int esize, unsigned int num)
6683342a13SHonnappa Nagarahalli {
6783342a13SHonnappa Nagarahalli 	size_t sz;
6883342a13SHonnappa Nagarahalli 
6983342a13SHonnappa Nagarahalli 	sz = num * sizeof(void *);
7083342a13SHonnappa Nagarahalli 	if (esize != -1)
7183342a13SHonnappa Nagarahalli 		sz = esize * num;
7283342a13SHonnappa Nagarahalli 
7383342a13SHonnappa Nagarahalli 	memcpy(dst, src, sz);
7483342a13SHonnappa Nagarahalli }
7583342a13SHonnappa Nagarahalli 
7683342a13SHonnappa Nagarahalli /* Copy to the ring memory */
7783342a13SHonnappa Nagarahalli static inline void
test_ring_copy_to(struct rte_ring_zc_data * zcd,void * const * src,int esize,unsigned int num)7883342a13SHonnappa Nagarahalli test_ring_copy_to(struct rte_ring_zc_data *zcd, void * const *src, int esize,
7983342a13SHonnappa Nagarahalli 	unsigned int num)
8083342a13SHonnappa Nagarahalli {
8183342a13SHonnappa Nagarahalli 	test_ring_mem_copy(zcd->ptr1, src, esize, zcd->n1);
8283342a13SHonnappa Nagarahalli 	if (zcd->n1 != num) {
8383342a13SHonnappa Nagarahalli 		if (esize == -1)
8483342a13SHonnappa Nagarahalli 			src = src + zcd->n1;
8583342a13SHonnappa Nagarahalli 		else
8683342a13SHonnappa Nagarahalli 			src = (void * const *)((const uint32_t *)src +
8783342a13SHonnappa Nagarahalli 					(zcd->n1 * esize / sizeof(uint32_t)));
8883342a13SHonnappa Nagarahalli 		test_ring_mem_copy(zcd->ptr2, src,
8983342a13SHonnappa Nagarahalli 					esize, num - zcd->n1);
9083342a13SHonnappa Nagarahalli 	}
9183342a13SHonnappa Nagarahalli }
9283342a13SHonnappa Nagarahalli 
9383342a13SHonnappa Nagarahalli /* Copy from the ring memory */
9483342a13SHonnappa Nagarahalli static inline void
test_ring_copy_from(struct rte_ring_zc_data * zcd,void * dst,int esize,unsigned int num)9583342a13SHonnappa Nagarahalli test_ring_copy_from(struct rte_ring_zc_data *zcd, void *dst, int esize,
9683342a13SHonnappa Nagarahalli 	unsigned int num)
9783342a13SHonnappa Nagarahalli {
9883342a13SHonnappa Nagarahalli 	test_ring_mem_copy(dst, zcd->ptr1, esize, zcd->n1);
9983342a13SHonnappa Nagarahalli 
10083342a13SHonnappa Nagarahalli 	if (zcd->n1 != num) {
10183342a13SHonnappa Nagarahalli 		dst = test_ring_inc_ptr(dst, esize, zcd->n1);
10283342a13SHonnappa Nagarahalli 		test_ring_mem_copy(dst, zcd->ptr2, esize, num - zcd->n1);
10383342a13SHonnappa Nagarahalli 	}
10483342a13SHonnappa Nagarahalli }
10583342a13SHonnappa Nagarahalli 
106981a0257SStanislaw Kardach static inline unsigned int
test_ring_enqueue(struct rte_ring * r,void ** obj,int esize,unsigned int n,unsigned int api_type)107a9fe1523SHonnappa Nagarahalli test_ring_enqueue(struct rte_ring *r, void **obj, int esize, unsigned int n,
108a9fe1523SHonnappa Nagarahalli 			unsigned int api_type)
109a9fe1523SHonnappa Nagarahalli {
110*a4cb5461SPaul Szczepanek 	unsigned int ret;
111*a4cb5461SPaul Szczepanek 	struct rte_ring_zc_data zcd = {0};
112*a4cb5461SPaul Szczepanek 
113a9fe1523SHonnappa Nagarahalli 	/* Legacy queue APIs? */
11431354c76SHonnappa Nagarahalli 	if (esize == -1)
115a9fe1523SHonnappa Nagarahalli 		switch (api_type) {
116a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE):
1176450023cSFeifei Wang 			return rte_ring_enqueue(r, *obj);
118a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_SINGLE):
1196450023cSFeifei Wang 			return rte_ring_sp_enqueue(r, *obj);
120a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_SINGLE):
1216450023cSFeifei Wang 			return rte_ring_mp_enqueue(r, *obj);
122a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BULK):
123a9fe1523SHonnappa Nagarahalli 			return rte_ring_enqueue_bulk(r, obj, n, NULL);
124a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BULK):
125a9fe1523SHonnappa Nagarahalli 			return rte_ring_sp_enqueue_bulk(r, obj, n, NULL);
126a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BULK):
127a9fe1523SHonnappa Nagarahalli 			return rte_ring_mp_enqueue_bulk(r, obj, n, NULL);
128a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST):
129a9fe1523SHonnappa Nagarahalli 			return rte_ring_enqueue_burst(r, obj, n, NULL);
130a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BURST):
131a9fe1523SHonnappa Nagarahalli 			return rte_ring_sp_enqueue_burst(r, obj, n, NULL);
132a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BURST):
133a9fe1523SHonnappa Nagarahalli 			return rte_ring_mp_enqueue_burst(r, obj, n, NULL);
134a9fe1523SHonnappa Nagarahalli 		default:
135a9fe1523SHonnappa Nagarahalli 			printf("Invalid API type\n");
136a9fe1523SHonnappa Nagarahalli 			return 0;
137a9fe1523SHonnappa Nagarahalli 		}
138a9fe1523SHonnappa Nagarahalli 	else
139a9fe1523SHonnappa Nagarahalli 		switch (api_type) {
140a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE):
141a9fe1523SHonnappa Nagarahalli 			return rte_ring_enqueue_elem(r, obj, esize);
142a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_SINGLE):
143a9fe1523SHonnappa Nagarahalli 			return rte_ring_sp_enqueue_elem(r, obj, esize);
144a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_SINGLE):
145a9fe1523SHonnappa Nagarahalli 			return rte_ring_mp_enqueue_elem(r, obj, esize);
146a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BULK):
147a9fe1523SHonnappa Nagarahalli 			return rte_ring_enqueue_bulk_elem(r, obj, esize, n,
148a9fe1523SHonnappa Nagarahalli 								NULL);
149a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BULK):
150a9fe1523SHonnappa Nagarahalli 			return rte_ring_sp_enqueue_bulk_elem(r, obj, esize, n,
151a9fe1523SHonnappa Nagarahalli 								NULL);
152a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BULK):
153a9fe1523SHonnappa Nagarahalli 			return rte_ring_mp_enqueue_bulk_elem(r, obj, esize, n,
154a9fe1523SHonnappa Nagarahalli 								NULL);
155a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST):
156a9fe1523SHonnappa Nagarahalli 			return rte_ring_enqueue_burst_elem(r, obj, esize, n,
157a9fe1523SHonnappa Nagarahalli 								NULL);
158a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BURST):
159a9fe1523SHonnappa Nagarahalli 			return rte_ring_sp_enqueue_burst_elem(r, obj, esize, n,
160a9fe1523SHonnappa Nagarahalli 								NULL);
161a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BURST):
162a9fe1523SHonnappa Nagarahalli 			return rte_ring_mp_enqueue_burst_elem(r, obj, esize, n,
163a9fe1523SHonnappa Nagarahalli 								NULL);
164*a4cb5461SPaul Szczepanek 		case (TEST_RING_ELEM_BURST_ZC):
165*a4cb5461SPaul Szczepanek 			ret = rte_ring_enqueue_zc_burst_elem_start(
166*a4cb5461SPaul Szczepanek 					r, esize, n, &zcd, NULL);
167*a4cb5461SPaul Szczepanek 			if (unlikely(ret == 0))
168*a4cb5461SPaul Szczepanek 				return 0;
169*a4cb5461SPaul Szczepanek 			rte_memcpy(zcd.ptr1, (char *)obj, zcd.n1 * esize);
170*a4cb5461SPaul Szczepanek 			if (unlikely(zcd.ptr2 != NULL))
171*a4cb5461SPaul Szczepanek 				rte_memcpy(zcd.ptr2,
172*a4cb5461SPaul Szczepanek 						(char *)obj + zcd.n1 * esize,
173*a4cb5461SPaul Szczepanek 						(ret - zcd.n1) * esize);
174*a4cb5461SPaul Szczepanek 			rte_ring_enqueue_zc_finish(r, ret);
175*a4cb5461SPaul Szczepanek 			return ret;
176*a4cb5461SPaul Szczepanek 		case (TEST_RING_ELEM_BURST_ZC_COMPRESS_PTR_16):
177*a4cb5461SPaul Szczepanek 			/* rings cannot store uint16_t so we use a uint32_t
178*a4cb5461SPaul Szczepanek 			 * and half the requested number of elements
179*a4cb5461SPaul Szczepanek 			 * and compensate by doubling the returned numbers
180*a4cb5461SPaul Szczepanek 			 */
181*a4cb5461SPaul Szczepanek 			ret = rte_ring_enqueue_zc_burst_elem_start(
182*a4cb5461SPaul Szczepanek 					r, sizeof(uint32_t), n / 2, &zcd, NULL);
183*a4cb5461SPaul Szczepanek 			if (unlikely(ret == 0))
184*a4cb5461SPaul Szczepanek 				return 0;
185*a4cb5461SPaul Szczepanek 			rte_ptr_compress_16_shift(
186*a4cb5461SPaul Szczepanek 					0, obj, zcd.ptr1, zcd.n1 * 2, 3);
187*a4cb5461SPaul Szczepanek 			if (unlikely(zcd.ptr2 != NULL))
188*a4cb5461SPaul Szczepanek 				rte_ptr_compress_16_shift(0,
189*a4cb5461SPaul Szczepanek 						obj + (zcd.n1 * 2),
190*a4cb5461SPaul Szczepanek 						zcd.ptr2,
191*a4cb5461SPaul Szczepanek 						(ret - zcd.n1) * 2, 3);
192*a4cb5461SPaul Szczepanek 			rte_ring_enqueue_zc_finish(r, ret);
193*a4cb5461SPaul Szczepanek 			return ret * 2;
194*a4cb5461SPaul Szczepanek 		case (TEST_RING_ELEM_BURST_ZC_COMPRESS_PTR_32):
195*a4cb5461SPaul Szczepanek 			ret = rte_ring_enqueue_zc_burst_elem_start(
196*a4cb5461SPaul Szczepanek 					r, sizeof(uint32_t), n, &zcd, NULL);
197*a4cb5461SPaul Szczepanek 			if (unlikely(ret == 0))
198*a4cb5461SPaul Szczepanek 				return 0;
199*a4cb5461SPaul Szczepanek 			rte_ptr_compress_32_shift(0, obj, zcd.ptr1, zcd.n1, 3);
200*a4cb5461SPaul Szczepanek 			if (unlikely(zcd.ptr2 != NULL))
201*a4cb5461SPaul Szczepanek 				rte_ptr_compress_32_shift(0, obj + zcd.n1,
202*a4cb5461SPaul Szczepanek 						zcd.ptr2, ret - zcd.n1, 3);
203*a4cb5461SPaul Szczepanek 			rte_ring_enqueue_zc_finish(r, ret);
204*a4cb5461SPaul Szczepanek 			return ret;
205a9fe1523SHonnappa Nagarahalli 		default:
206a9fe1523SHonnappa Nagarahalli 			printf("Invalid API type\n");
207a9fe1523SHonnappa Nagarahalli 			return 0;
208a9fe1523SHonnappa Nagarahalli 		}
209a9fe1523SHonnappa Nagarahalli }
210a9fe1523SHonnappa Nagarahalli 
211981a0257SStanislaw Kardach static inline unsigned int
test_ring_dequeue(struct rte_ring * r,void ** obj,int esize,unsigned int n,unsigned int api_type)212a9fe1523SHonnappa Nagarahalli test_ring_dequeue(struct rte_ring *r, void **obj, int esize, unsigned int n,
213a9fe1523SHonnappa Nagarahalli 			unsigned int api_type)
214a9fe1523SHonnappa Nagarahalli {
215*a4cb5461SPaul Szczepanek 	unsigned int ret;
216*a4cb5461SPaul Szczepanek 	struct rte_ring_zc_data zcd = {0};
217*a4cb5461SPaul Szczepanek 
218a9fe1523SHonnappa Nagarahalli 	/* Legacy queue APIs? */
21931354c76SHonnappa Nagarahalli 	if (esize == -1)
220a9fe1523SHonnappa Nagarahalli 		switch (api_type) {
221a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE):
222a9fe1523SHonnappa Nagarahalli 			return rte_ring_dequeue(r, obj);
223a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_SINGLE):
224a9fe1523SHonnappa Nagarahalli 			return rte_ring_sc_dequeue(r, obj);
225a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_SINGLE):
226a9fe1523SHonnappa Nagarahalli 			return rte_ring_mc_dequeue(r, obj);
227a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BULK):
228a9fe1523SHonnappa Nagarahalli 			return rte_ring_dequeue_bulk(r, obj, n, NULL);
229a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BULK):
230a9fe1523SHonnappa Nagarahalli 			return rte_ring_sc_dequeue_bulk(r, obj, n, NULL);
231a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BULK):
232a9fe1523SHonnappa Nagarahalli 			return rte_ring_mc_dequeue_bulk(r, obj, n, NULL);
233a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST):
234a9fe1523SHonnappa Nagarahalli 			return rte_ring_dequeue_burst(r, obj, n, NULL);
235a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BURST):
236a9fe1523SHonnappa Nagarahalli 			return rte_ring_sc_dequeue_burst(r, obj, n, NULL);
237a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BURST):
238a9fe1523SHonnappa Nagarahalli 			return rte_ring_mc_dequeue_burst(r, obj, n, NULL);
239a9fe1523SHonnappa Nagarahalli 		default:
240a9fe1523SHonnappa Nagarahalli 			printf("Invalid API type\n");
241a9fe1523SHonnappa Nagarahalli 			return 0;
242a9fe1523SHonnappa Nagarahalli 		}
243a9fe1523SHonnappa Nagarahalli 	else
244a9fe1523SHonnappa Nagarahalli 		switch (api_type) {
245a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE):
246a9fe1523SHonnappa Nagarahalli 			return rte_ring_dequeue_elem(r, obj, esize);
247a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_SINGLE):
248a9fe1523SHonnappa Nagarahalli 			return rte_ring_sc_dequeue_elem(r, obj, esize);
249a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_SINGLE):
250a9fe1523SHonnappa Nagarahalli 			return rte_ring_mc_dequeue_elem(r, obj, esize);
251a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BULK):
252a9fe1523SHonnappa Nagarahalli 			return rte_ring_dequeue_bulk_elem(r, obj, esize,
253a9fe1523SHonnappa Nagarahalli 								n, NULL);
254a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BULK):
255a9fe1523SHonnappa Nagarahalli 			return rte_ring_sc_dequeue_bulk_elem(r, obj, esize,
256a9fe1523SHonnappa Nagarahalli 								n, NULL);
257a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BULK):
258a9fe1523SHonnappa Nagarahalli 			return rte_ring_mc_dequeue_bulk_elem(r, obj, esize,
259a9fe1523SHonnappa Nagarahalli 								n, NULL);
260a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST):
261a9fe1523SHonnappa Nagarahalli 			return rte_ring_dequeue_burst_elem(r, obj, esize,
262a9fe1523SHonnappa Nagarahalli 								n, NULL);
263a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_SPSC | TEST_RING_ELEM_BURST):
264a9fe1523SHonnappa Nagarahalli 			return rte_ring_sc_dequeue_burst_elem(r, obj, esize,
265a9fe1523SHonnappa Nagarahalli 								n, NULL);
266a9fe1523SHonnappa Nagarahalli 		case (TEST_RING_THREAD_MPMC | TEST_RING_ELEM_BURST):
267a9fe1523SHonnappa Nagarahalli 			return rte_ring_mc_dequeue_burst_elem(r, obj, esize,
268a9fe1523SHonnappa Nagarahalli 								n, NULL);
269*a4cb5461SPaul Szczepanek 		case (TEST_RING_ELEM_BURST_ZC):
270*a4cb5461SPaul Szczepanek 			ret = rte_ring_dequeue_zc_burst_elem_start(
271*a4cb5461SPaul Szczepanek 					r, esize, n, &zcd, NULL);
272*a4cb5461SPaul Szczepanek 			if (unlikely(ret == 0))
273*a4cb5461SPaul Szczepanek 				return 0;
274*a4cb5461SPaul Szczepanek 			rte_memcpy((char *)obj, zcd.ptr1, zcd.n1 * esize);
275*a4cb5461SPaul Szczepanek 			if (unlikely(zcd.ptr2 != NULL))
276*a4cb5461SPaul Szczepanek 				rte_memcpy((char *)obj + zcd.n1 * esize,
277*a4cb5461SPaul Szczepanek 						zcd.ptr2,
278*a4cb5461SPaul Szczepanek 						(ret - zcd.n1) * esize);
279*a4cb5461SPaul Szczepanek 			rte_ring_dequeue_zc_finish(r, ret);
280*a4cb5461SPaul Szczepanek 			return ret;
281*a4cb5461SPaul Szczepanek 		case (TEST_RING_ELEM_BURST_ZC_COMPRESS_PTR_16):
282*a4cb5461SPaul Szczepanek 			/* rings cannot store uint16_t so we use a uint32_t
283*a4cb5461SPaul Szczepanek 			 * and half the requested number of elements
284*a4cb5461SPaul Szczepanek 			 * and compensate by doubling the returned numbers
285*a4cb5461SPaul Szczepanek 			 */
286*a4cb5461SPaul Szczepanek 			ret = rte_ring_dequeue_zc_burst_elem_start(
287*a4cb5461SPaul Szczepanek 					r, sizeof(uint32_t), n / 2, &zcd, NULL);
288*a4cb5461SPaul Szczepanek 			if (unlikely(ret == 0))
289*a4cb5461SPaul Szczepanek 				return 0;
290*a4cb5461SPaul Szczepanek 			rte_ptr_decompress_16_shift(
291*a4cb5461SPaul Szczepanek 					0, zcd.ptr1, obj, zcd.n1 * 2, 3);
292*a4cb5461SPaul Szczepanek 			if (unlikely(zcd.ptr2 != NULL))
293*a4cb5461SPaul Szczepanek 				rte_ptr_decompress_16_shift(0, zcd.ptr2,
294*a4cb5461SPaul Szczepanek 						obj + zcd.n1,
295*a4cb5461SPaul Szczepanek 						(ret - zcd.n1) * 2,
296*a4cb5461SPaul Szczepanek 						3);
297*a4cb5461SPaul Szczepanek 			rte_ring_dequeue_zc_finish(r, ret);
298*a4cb5461SPaul Szczepanek 			return ret * 2;
299*a4cb5461SPaul Szczepanek 		case (TEST_RING_ELEM_BURST_ZC_COMPRESS_PTR_32):
300*a4cb5461SPaul Szczepanek 			ret = rte_ring_dequeue_zc_burst_elem_start(
301*a4cb5461SPaul Szczepanek 					r, sizeof(uint32_t), n, &zcd, NULL);
302*a4cb5461SPaul Szczepanek 			if (unlikely(ret == 0))
303*a4cb5461SPaul Szczepanek 				return 0;
304*a4cb5461SPaul Szczepanek 			rte_ptr_decompress_32_shift(0, zcd.ptr1, obj, zcd.n1, 3);
305*a4cb5461SPaul Szczepanek 			if (unlikely(zcd.ptr2 != NULL))
306*a4cb5461SPaul Szczepanek 				rte_ptr_decompress_32_shift(0, zcd.ptr2,
307*a4cb5461SPaul Szczepanek 						obj + zcd.n1, ret - zcd.n1, 3);
308*a4cb5461SPaul Szczepanek 			rte_ring_dequeue_zc_finish(r, ret);
309*a4cb5461SPaul Szczepanek 			return ret;
310a9fe1523SHonnappa Nagarahalli 		default:
311a9fe1523SHonnappa Nagarahalli 			printf("Invalid API type\n");
312a9fe1523SHonnappa Nagarahalli 			return 0;
313a9fe1523SHonnappa Nagarahalli 		}
314a9fe1523SHonnappa Nagarahalli }
315a9fe1523SHonnappa Nagarahalli 
316a9fe1523SHonnappa Nagarahalli /* This function is placed here as it is required for both
317a9fe1523SHonnappa Nagarahalli  * performance and functional tests.
318a9fe1523SHonnappa Nagarahalli  */
319981a0257SStanislaw Kardach static inline void *
test_ring_calloc(unsigned int rsize,int esize)320a9fe1523SHonnappa Nagarahalli test_ring_calloc(unsigned int rsize, int esize)
321a9fe1523SHonnappa Nagarahalli {
322a9fe1523SHonnappa Nagarahalli 	unsigned int sz;
323a9fe1523SHonnappa Nagarahalli 	void *p;
324a9fe1523SHonnappa Nagarahalli 
325a9fe1523SHonnappa Nagarahalli 	/* Legacy queue APIs? */
326a9fe1523SHonnappa Nagarahalli 	if (esize == -1)
327a9fe1523SHonnappa Nagarahalli 		sz = sizeof(void *);
328a9fe1523SHonnappa Nagarahalli 	else
329a9fe1523SHonnappa Nagarahalli 		sz = esize;
330a9fe1523SHonnappa Nagarahalli 
331a9fe1523SHonnappa Nagarahalli 	p = rte_zmalloc(NULL, rsize * sz, RTE_CACHE_LINE_SIZE);
332a9fe1523SHonnappa Nagarahalli 	if (p == NULL)
333a9fe1523SHonnappa Nagarahalli 		printf("Failed to allocate memory\n");
334a9fe1523SHonnappa Nagarahalli 
335a9fe1523SHonnappa Nagarahalli 	return p;
336a9fe1523SHonnappa Nagarahalli }
337