xref: /dpdk/app/test/test_ring.c (revision e0a8442ccd15bafbb7eb150c35331c8e3b828c53)
1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2a9de470cSBruce Richardson  * Copyright(c) 2010-2014 Intel Corporation
383342a13SHonnappa Nagarahalli  * Copyright(c) 2020 Arm Limited
4a9de470cSBruce Richardson  */
5a9de470cSBruce Richardson 
6a9de470cSBruce Richardson #include <string.h>
7a9de470cSBruce Richardson #include <stdarg.h>
8a9de470cSBruce Richardson #include <stdio.h>
9a9de470cSBruce Richardson #include <stdlib.h>
10a9de470cSBruce Richardson #include <stdint.h>
11a9de470cSBruce Richardson #include <inttypes.h>
12a9de470cSBruce Richardson #include <errno.h>
13a9de470cSBruce Richardson #include <sys/queue.h>
14a9de470cSBruce Richardson 
15a9de470cSBruce Richardson #include <rte_common.h>
16a9de470cSBruce Richardson #include <rte_log.h>
17a9de470cSBruce Richardson #include <rte_memory.h>
18a9de470cSBruce Richardson #include <rte_launch.h>
19a9de470cSBruce Richardson #include <rte_cycles.h>
20a9de470cSBruce Richardson #include <rte_eal.h>
21a9de470cSBruce Richardson #include <rte_per_lcore.h>
22a9de470cSBruce Richardson #include <rte_lcore.h>
23a9de470cSBruce Richardson #include <rte_branch_prediction.h>
24a9de470cSBruce Richardson #include <rte_malloc.h>
25a9de470cSBruce Richardson #include <rte_ring.h>
26a9fe1523SHonnappa Nagarahalli #include <rte_ring_elem.h>
27a9de470cSBruce Richardson #include <rte_random.h>
28a9de470cSBruce Richardson #include <rte_errno.h>
29a9de470cSBruce Richardson #include <rte_hexdump.h>
30a9de470cSBruce Richardson 
31a9de470cSBruce Richardson #include "test.h"
32a9fe1523SHonnappa Nagarahalli #include "test_ring.h"
33a9de470cSBruce Richardson 
34a9de470cSBruce Richardson /*
35a9de470cSBruce Richardson  * Ring
36a9de470cSBruce Richardson  * ====
37a9de470cSBruce Richardson  *
38a9fe1523SHonnappa Nagarahalli  * #. Functional tests. Tests single/bulk/burst, default/SPSC/MPMC,
39a9fe1523SHonnappa Nagarahalli  *    legacy/custom element size (4B, 8B, 16B, 20B) APIs.
40a9fe1523SHonnappa Nagarahalli  *    Some tests incorporate unaligned addresses for objects.
41a9fe1523SHonnappa Nagarahalli  *    The enqueued/dequeued data is validated for correctness.
42a9de470cSBruce Richardson  *
43a9fe1523SHonnappa Nagarahalli  * #. Performance tests are in test_ring_perf.c
44a9de470cSBruce Richardson  */
45a9de470cSBruce Richardson 
46a9de470cSBruce Richardson #define RING_SIZE 4096
47a9de470cSBruce Richardson #define MAX_BULK 32
48a9de470cSBruce Richardson 
4946697431SFeifei Wang /*
5046697431SFeifei Wang  * Validate the return value of test cases and print details of the
5146697431SFeifei Wang  * ring if validation fails
5246697431SFeifei Wang  *
5346697431SFeifei Wang  * @param exp
5446697431SFeifei Wang  *   Expression to validate return value.
5546697431SFeifei Wang  * @param r
5646697431SFeifei Wang  *   A pointer to the ring structure.
5746697431SFeifei Wang  */
5846697431SFeifei Wang #define TEST_RING_VERIFY(exp, r, errst) do {				\
59a9de470cSBruce Richardson 	if (!(exp)) {							\
60a9de470cSBruce Richardson 		printf("error at %s:%d\tcondition " #exp " failed\n",	\
61a9de470cSBruce Richardson 		    __func__, __LINE__);				\
6246697431SFeifei Wang 		rte_ring_dump(stdout, (r));				\
6346697431SFeifei Wang 		errst;							\
6446697431SFeifei Wang 	}								\
6546697431SFeifei Wang } while (0)
66a9de470cSBruce Richardson 
6746697431SFeifei Wang #define TEST_RING_FULL_EMPTY_ITER	8
68a9de470cSBruce Richardson 
69a9fe1523SHonnappa Nagarahalli static const int esize[] = {-1, 4, 8, 16, 20};
70a9fe1523SHonnappa Nagarahalli 
7183342a13SHonnappa Nagarahalli /* Wrappers around the zero-copy APIs. The wrappers match
7283342a13SHonnappa Nagarahalli  * the normal enqueue/dequeue API declarations.
7383342a13SHonnappa Nagarahalli  */
7483342a13SHonnappa Nagarahalli static unsigned int
test_ring_enqueue_zc_bulk(struct rte_ring * r,void * const * obj_table,unsigned int n,unsigned int * free_space)7583342a13SHonnappa Nagarahalli test_ring_enqueue_zc_bulk(struct rte_ring *r, void * const *obj_table,
7683342a13SHonnappa Nagarahalli 	unsigned int n, unsigned int *free_space)
7783342a13SHonnappa Nagarahalli {
7883342a13SHonnappa Nagarahalli 	uint32_t ret;
7983342a13SHonnappa Nagarahalli 	struct rte_ring_zc_data zcd;
8083342a13SHonnappa Nagarahalli 
8183342a13SHonnappa Nagarahalli 	ret = rte_ring_enqueue_zc_bulk_start(r, n, &zcd, free_space);
8283342a13SHonnappa Nagarahalli 	if (ret != 0) {
8383342a13SHonnappa Nagarahalli 		/* Copy the data to the ring */
8483342a13SHonnappa Nagarahalli 		test_ring_copy_to(&zcd, obj_table, sizeof(void *), ret);
8583342a13SHonnappa Nagarahalli 		rte_ring_enqueue_zc_finish(r, ret);
8683342a13SHonnappa Nagarahalli 	}
8783342a13SHonnappa Nagarahalli 
8883342a13SHonnappa Nagarahalli 	return ret;
8983342a13SHonnappa Nagarahalli }
9083342a13SHonnappa Nagarahalli 
9183342a13SHonnappa Nagarahalli static unsigned int
test_ring_enqueue_zc_bulk_elem(struct rte_ring * r,const void * obj_table,unsigned int esize,unsigned int n,unsigned int * free_space)9283342a13SHonnappa Nagarahalli test_ring_enqueue_zc_bulk_elem(struct rte_ring *r, const void *obj_table,
9383342a13SHonnappa Nagarahalli 	unsigned int esize, unsigned int n, unsigned int *free_space)
9483342a13SHonnappa Nagarahalli {
9583342a13SHonnappa Nagarahalli 	unsigned int ret;
9683342a13SHonnappa Nagarahalli 	struct rte_ring_zc_data zcd;
9783342a13SHonnappa Nagarahalli 
9883342a13SHonnappa Nagarahalli 	ret = rte_ring_enqueue_zc_bulk_elem_start(r, esize, n,
9983342a13SHonnappa Nagarahalli 				&zcd, free_space);
10083342a13SHonnappa Nagarahalli 	if (ret != 0) {
10183342a13SHonnappa Nagarahalli 		/* Copy the data to the ring */
10283342a13SHonnappa Nagarahalli 		test_ring_copy_to(&zcd, obj_table, esize, ret);
10383342a13SHonnappa Nagarahalli 		rte_ring_enqueue_zc_finish(r, ret);
10483342a13SHonnappa Nagarahalli 	}
10583342a13SHonnappa Nagarahalli 
10683342a13SHonnappa Nagarahalli 	return ret;
10783342a13SHonnappa Nagarahalli }
10883342a13SHonnappa Nagarahalli 
10983342a13SHonnappa Nagarahalli static unsigned int
test_ring_enqueue_zc_burst(struct rte_ring * r,void * const * obj_table,unsigned int n,unsigned int * free_space)11083342a13SHonnappa Nagarahalli test_ring_enqueue_zc_burst(struct rte_ring *r, void * const *obj_table,
11183342a13SHonnappa Nagarahalli 	unsigned int n, unsigned int *free_space)
11283342a13SHonnappa Nagarahalli {
11383342a13SHonnappa Nagarahalli 	unsigned int ret;
11483342a13SHonnappa Nagarahalli 	struct rte_ring_zc_data zcd;
11583342a13SHonnappa Nagarahalli 
11683342a13SHonnappa Nagarahalli 	ret = rte_ring_enqueue_zc_burst_start(r, n, &zcd, free_space);
11783342a13SHonnappa Nagarahalli 	if (ret != 0) {
11883342a13SHonnappa Nagarahalli 		/* Copy the data to the ring */
11983342a13SHonnappa Nagarahalli 		test_ring_copy_to(&zcd, obj_table, sizeof(void *), ret);
12083342a13SHonnappa Nagarahalli 		rte_ring_enqueue_zc_finish(r, ret);
12183342a13SHonnappa Nagarahalli 	}
12283342a13SHonnappa Nagarahalli 
12383342a13SHonnappa Nagarahalli 	return ret;
12483342a13SHonnappa Nagarahalli }
12583342a13SHonnappa Nagarahalli 
12683342a13SHonnappa Nagarahalli static unsigned int
test_ring_enqueue_zc_burst_elem(struct rte_ring * r,const void * obj_table,unsigned int esize,unsigned int n,unsigned int * free_space)12783342a13SHonnappa Nagarahalli test_ring_enqueue_zc_burst_elem(struct rte_ring *r, const void *obj_table,
12883342a13SHonnappa Nagarahalli 	unsigned int esize, unsigned int n, unsigned int *free_space)
12983342a13SHonnappa Nagarahalli {
13083342a13SHonnappa Nagarahalli 	unsigned int ret;
13183342a13SHonnappa Nagarahalli 	struct rte_ring_zc_data zcd;
13283342a13SHonnappa Nagarahalli 
13383342a13SHonnappa Nagarahalli 	ret = rte_ring_enqueue_zc_burst_elem_start(r, esize, n,
13483342a13SHonnappa Nagarahalli 				&zcd, free_space);
13583342a13SHonnappa Nagarahalli 	if (ret != 0) {
13683342a13SHonnappa Nagarahalli 		/* Copy the data to the ring */
13783342a13SHonnappa Nagarahalli 		test_ring_copy_to(&zcd, obj_table, esize, ret);
13883342a13SHonnappa Nagarahalli 		rte_ring_enqueue_zc_finish(r, ret);
13983342a13SHonnappa Nagarahalli 	}
14083342a13SHonnappa Nagarahalli 
14183342a13SHonnappa Nagarahalli 	return ret;
14283342a13SHonnappa Nagarahalli }
14383342a13SHonnappa Nagarahalli 
14483342a13SHonnappa Nagarahalli static unsigned int
test_ring_dequeue_zc_bulk(struct rte_ring * r,void ** obj_table,unsigned int n,unsigned int * available)14583342a13SHonnappa Nagarahalli test_ring_dequeue_zc_bulk(struct rte_ring *r, void **obj_table,
14683342a13SHonnappa Nagarahalli 	unsigned int n, unsigned int *available)
14783342a13SHonnappa Nagarahalli {
14883342a13SHonnappa Nagarahalli 	unsigned int ret;
14983342a13SHonnappa Nagarahalli 	struct rte_ring_zc_data zcd;
15083342a13SHonnappa Nagarahalli 
15183342a13SHonnappa Nagarahalli 	ret = rte_ring_dequeue_zc_bulk_start(r, n, &zcd, available);
15283342a13SHonnappa Nagarahalli 	if (ret != 0) {
15383342a13SHonnappa Nagarahalli 		/* Copy the data from the ring */
15483342a13SHonnappa Nagarahalli 		test_ring_copy_from(&zcd, obj_table, sizeof(void *), ret);
15583342a13SHonnappa Nagarahalli 		rte_ring_dequeue_zc_finish(r, ret);
15683342a13SHonnappa Nagarahalli 	}
15783342a13SHonnappa Nagarahalli 
15883342a13SHonnappa Nagarahalli 	return ret;
15983342a13SHonnappa Nagarahalli }
16083342a13SHonnappa Nagarahalli 
16183342a13SHonnappa Nagarahalli static unsigned int
test_ring_dequeue_zc_bulk_elem(struct rte_ring * r,void * obj_table,unsigned int esize,unsigned int n,unsigned int * available)16283342a13SHonnappa Nagarahalli test_ring_dequeue_zc_bulk_elem(struct rte_ring *r, void *obj_table,
16383342a13SHonnappa Nagarahalli 	unsigned int esize, unsigned int n, unsigned int *available)
16483342a13SHonnappa Nagarahalli {
16583342a13SHonnappa Nagarahalli 	unsigned int ret;
16683342a13SHonnappa Nagarahalli 	struct rte_ring_zc_data zcd;
16783342a13SHonnappa Nagarahalli 
16883342a13SHonnappa Nagarahalli 	ret = rte_ring_dequeue_zc_bulk_elem_start(r, esize, n,
16983342a13SHonnappa Nagarahalli 				&zcd, available);
17083342a13SHonnappa Nagarahalli 	if (ret != 0) {
17183342a13SHonnappa Nagarahalli 		/* Copy the data from the ring */
17283342a13SHonnappa Nagarahalli 		test_ring_copy_from(&zcd, obj_table, esize, ret);
17383342a13SHonnappa Nagarahalli 		rte_ring_dequeue_zc_finish(r, ret);
17483342a13SHonnappa Nagarahalli 	}
17583342a13SHonnappa Nagarahalli 
17683342a13SHonnappa Nagarahalli 	return ret;
17783342a13SHonnappa Nagarahalli }
17883342a13SHonnappa Nagarahalli 
17983342a13SHonnappa Nagarahalli static unsigned int
test_ring_dequeue_zc_burst(struct rte_ring * r,void ** obj_table,unsigned int n,unsigned int * available)18083342a13SHonnappa Nagarahalli test_ring_dequeue_zc_burst(struct rte_ring *r, void **obj_table,
18183342a13SHonnappa Nagarahalli 	unsigned int n, unsigned int *available)
18283342a13SHonnappa Nagarahalli {
18383342a13SHonnappa Nagarahalli 	unsigned int ret;
18483342a13SHonnappa Nagarahalli 	struct rte_ring_zc_data zcd;
18583342a13SHonnappa Nagarahalli 
18683342a13SHonnappa Nagarahalli 	ret = rte_ring_dequeue_zc_burst_start(r, n, &zcd, available);
18783342a13SHonnappa Nagarahalli 	if (ret != 0) {
18883342a13SHonnappa Nagarahalli 		/* Copy the data from the ring */
18983342a13SHonnappa Nagarahalli 		test_ring_copy_from(&zcd, obj_table, sizeof(void *), ret);
19083342a13SHonnappa Nagarahalli 		rte_ring_dequeue_zc_finish(r, ret);
19183342a13SHonnappa Nagarahalli 	}
19283342a13SHonnappa Nagarahalli 
19383342a13SHonnappa Nagarahalli 	return ret;
19483342a13SHonnappa Nagarahalli }
19583342a13SHonnappa Nagarahalli 
19683342a13SHonnappa Nagarahalli static unsigned int
test_ring_dequeue_zc_burst_elem(struct rte_ring * r,void * obj_table,unsigned int esize,unsigned int n,unsigned int * available)19783342a13SHonnappa Nagarahalli test_ring_dequeue_zc_burst_elem(struct rte_ring *r, void *obj_table,
19883342a13SHonnappa Nagarahalli 	unsigned int esize, unsigned int n, unsigned int *available)
19983342a13SHonnappa Nagarahalli {
20083342a13SHonnappa Nagarahalli 	unsigned int ret;
20183342a13SHonnappa Nagarahalli 	struct rte_ring_zc_data zcd;
20283342a13SHonnappa Nagarahalli 
20383342a13SHonnappa Nagarahalli 	ret = rte_ring_dequeue_zc_burst_elem_start(r, esize, n,
20483342a13SHonnappa Nagarahalli 				&zcd, available);
20583342a13SHonnappa Nagarahalli 	if (ret != 0) {
20683342a13SHonnappa Nagarahalli 		/* Copy the data from the ring */
20783342a13SHonnappa Nagarahalli 		test_ring_copy_from(&zcd, obj_table, esize, ret);
20883342a13SHonnappa Nagarahalli 		rte_ring_dequeue_zc_finish(r, ret);
20983342a13SHonnappa Nagarahalli 	}
21083342a13SHonnappa Nagarahalli 
21183342a13SHonnappa Nagarahalli 	return ret;
21283342a13SHonnappa Nagarahalli }
21383342a13SHonnappa Nagarahalli 
2142d59e9c8SKonstantin Ananyev static const struct {
2152d59e9c8SKonstantin Ananyev 	const char *desc;
2162d59e9c8SKonstantin Ananyev 	uint32_t api_type;
2172d59e9c8SKonstantin Ananyev 	uint32_t create_flags;
2182d59e9c8SKonstantin Ananyev 	struct {
2192d59e9c8SKonstantin Ananyev 		unsigned int (*flegacy)(struct rte_ring *r,
2202d59e9c8SKonstantin Ananyev 			void * const *obj_table, unsigned int n,
2212d59e9c8SKonstantin Ananyev 			unsigned int *free_space);
2222d59e9c8SKonstantin Ananyev 		unsigned int (*felem)(struct rte_ring *r, const void *obj_table,
2232d59e9c8SKonstantin Ananyev 			unsigned int esize, unsigned int n,
2242d59e9c8SKonstantin Ananyev 			unsigned int *free_space);
2252d59e9c8SKonstantin Ananyev 	} enq;
2262d59e9c8SKonstantin Ananyev 	struct {
2272d59e9c8SKonstantin Ananyev 		unsigned int (*flegacy)(struct rte_ring *r,
2282d59e9c8SKonstantin Ananyev 			void **obj_table, unsigned int n,
2292d59e9c8SKonstantin Ananyev 			unsigned int *available);
2302d59e9c8SKonstantin Ananyev 		unsigned int (*felem)(struct rte_ring *r, void *obj_table,
2312d59e9c8SKonstantin Ananyev 			unsigned int esize, unsigned int n,
2322d59e9c8SKonstantin Ananyev 			unsigned int *available);
2332d59e9c8SKonstantin Ananyev 	} deq;
2342d59e9c8SKonstantin Ananyev } test_enqdeq_impl[] = {
2352d59e9c8SKonstantin Ananyev 	{
2362d59e9c8SKonstantin Ananyev 		.desc = "MP/MC sync mode",
2372d59e9c8SKonstantin Ananyev 		.api_type = TEST_RING_ELEM_BULK | TEST_RING_THREAD_DEF,
2382d59e9c8SKonstantin Ananyev 		.create_flags = 0,
2392d59e9c8SKonstantin Ananyev 		.enq = {
2402d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_enqueue_bulk,
2412d59e9c8SKonstantin Ananyev 			.felem = rte_ring_enqueue_bulk_elem,
2422d59e9c8SKonstantin Ananyev 		},
2432d59e9c8SKonstantin Ananyev 		.deq = {
2442d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_dequeue_bulk,
2452d59e9c8SKonstantin Ananyev 			.felem = rte_ring_dequeue_bulk_elem,
2462d59e9c8SKonstantin Ananyev 		},
2472d59e9c8SKonstantin Ananyev 	},
2482d59e9c8SKonstantin Ananyev 	{
2492d59e9c8SKonstantin Ananyev 		.desc = "SP/SC sync mode",
2502d59e9c8SKonstantin Ananyev 		.api_type = TEST_RING_ELEM_BULK | TEST_RING_THREAD_SPSC,
2512d59e9c8SKonstantin Ananyev 		.create_flags = RING_F_SP_ENQ | RING_F_SC_DEQ,
2522d59e9c8SKonstantin Ananyev 		.enq = {
2532d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_sp_enqueue_bulk,
2542d59e9c8SKonstantin Ananyev 			.felem = rte_ring_sp_enqueue_bulk_elem,
2552d59e9c8SKonstantin Ananyev 		},
2562d59e9c8SKonstantin Ananyev 		.deq = {
2572d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_sc_dequeue_bulk,
2582d59e9c8SKonstantin Ananyev 			.felem = rte_ring_sc_dequeue_bulk_elem,
2592d59e9c8SKonstantin Ananyev 		},
2602d59e9c8SKonstantin Ananyev 	},
2612d59e9c8SKonstantin Ananyev 	{
2622d59e9c8SKonstantin Ananyev 		.desc = "MP/MC sync mode",
2632d59e9c8SKonstantin Ananyev 		.api_type = TEST_RING_ELEM_BULK | TEST_RING_THREAD_MPMC,
2642d59e9c8SKonstantin Ananyev 		.create_flags = 0,
2652d59e9c8SKonstantin Ananyev 		.enq = {
2662d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_mp_enqueue_bulk,
2672d59e9c8SKonstantin Ananyev 			.felem = rte_ring_mp_enqueue_bulk_elem,
2682d59e9c8SKonstantin Ananyev 		},
2692d59e9c8SKonstantin Ananyev 		.deq = {
2702d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_mc_dequeue_bulk,
2712d59e9c8SKonstantin Ananyev 			.felem = rte_ring_mc_dequeue_bulk_elem,
2722d59e9c8SKonstantin Ananyev 		},
2732d59e9c8SKonstantin Ananyev 	},
2742d59e9c8SKonstantin Ananyev 	{
2752d59e9c8SKonstantin Ananyev 		.desc = "MP_RTS/MC_RTS sync mode",
2762d59e9c8SKonstantin Ananyev 		.api_type = TEST_RING_ELEM_BULK | TEST_RING_THREAD_DEF,
2772d59e9c8SKonstantin Ananyev 		.create_flags = RING_F_MP_RTS_ENQ | RING_F_MC_RTS_DEQ,
2782d59e9c8SKonstantin Ananyev 		.enq = {
2792d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_enqueue_bulk,
2802d59e9c8SKonstantin Ananyev 			.felem = rte_ring_enqueue_bulk_elem,
2812d59e9c8SKonstantin Ananyev 		},
2822d59e9c8SKonstantin Ananyev 		.deq = {
2832d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_dequeue_bulk,
2842d59e9c8SKonstantin Ananyev 			.felem = rte_ring_dequeue_bulk_elem,
2852d59e9c8SKonstantin Ananyev 		},
2862d59e9c8SKonstantin Ananyev 	},
2872d59e9c8SKonstantin Ananyev 	{
2882d59e9c8SKonstantin Ananyev 		.desc = "MP_HTS/MC_HTS sync mode",
2892d59e9c8SKonstantin Ananyev 		.api_type = TEST_RING_ELEM_BULK | TEST_RING_THREAD_DEF,
2902d59e9c8SKonstantin Ananyev 		.create_flags = RING_F_MP_HTS_ENQ | RING_F_MC_HTS_DEQ,
2912d59e9c8SKonstantin Ananyev 		.enq = {
2922d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_enqueue_bulk,
2932d59e9c8SKonstantin Ananyev 			.felem = rte_ring_enqueue_bulk_elem,
2942d59e9c8SKonstantin Ananyev 		},
2952d59e9c8SKonstantin Ananyev 		.deq = {
2962d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_dequeue_bulk,
2972d59e9c8SKonstantin Ananyev 			.felem = rte_ring_dequeue_bulk_elem,
2982d59e9c8SKonstantin Ananyev 		},
2992d59e9c8SKonstantin Ananyev 	},
3002d59e9c8SKonstantin Ananyev 	{
3012d59e9c8SKonstantin Ananyev 		.desc = "MP/MC sync mode",
3022d59e9c8SKonstantin Ananyev 		.api_type = TEST_RING_ELEM_BURST | TEST_RING_THREAD_DEF,
3032d59e9c8SKonstantin Ananyev 		.create_flags = 0,
3042d59e9c8SKonstantin Ananyev 		.enq = {
3052d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_enqueue_burst,
3062d59e9c8SKonstantin Ananyev 			.felem = rte_ring_enqueue_burst_elem,
3072d59e9c8SKonstantin Ananyev 		},
3082d59e9c8SKonstantin Ananyev 		.deq = {
3092d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_dequeue_burst,
3102d59e9c8SKonstantin Ananyev 			.felem = rte_ring_dequeue_burst_elem,
3112d59e9c8SKonstantin Ananyev 		},
3122d59e9c8SKonstantin Ananyev 	},
3132d59e9c8SKonstantin Ananyev 	{
3142d59e9c8SKonstantin Ananyev 		.desc = "SP/SC sync mode",
3152d59e9c8SKonstantin Ananyev 		.api_type = TEST_RING_ELEM_BURST | TEST_RING_THREAD_SPSC,
3162d59e9c8SKonstantin Ananyev 		.create_flags = RING_F_SP_ENQ | RING_F_SC_DEQ,
3172d59e9c8SKonstantin Ananyev 		.enq = {
3182d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_sp_enqueue_burst,
3192d59e9c8SKonstantin Ananyev 			.felem = rte_ring_sp_enqueue_burst_elem,
3202d59e9c8SKonstantin Ananyev 		},
3212d59e9c8SKonstantin Ananyev 		.deq = {
3222d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_sc_dequeue_burst,
3232d59e9c8SKonstantin Ananyev 			.felem = rte_ring_sc_dequeue_burst_elem,
3242d59e9c8SKonstantin Ananyev 		},
3252d59e9c8SKonstantin Ananyev 	},
3262d59e9c8SKonstantin Ananyev 	{
3272d59e9c8SKonstantin Ananyev 		.desc = "MP/MC sync mode",
3282d59e9c8SKonstantin Ananyev 		.api_type = TEST_RING_ELEM_BURST | TEST_RING_THREAD_MPMC,
3292d59e9c8SKonstantin Ananyev 		.create_flags = 0,
3302d59e9c8SKonstantin Ananyev 		.enq = {
3312d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_mp_enqueue_burst,
3322d59e9c8SKonstantin Ananyev 			.felem = rte_ring_mp_enqueue_burst_elem,
3332d59e9c8SKonstantin Ananyev 		},
3342d59e9c8SKonstantin Ananyev 		.deq = {
3352d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_mc_dequeue_burst,
3362d59e9c8SKonstantin Ananyev 			.felem = rte_ring_mc_dequeue_burst_elem,
3372d59e9c8SKonstantin Ananyev 		},
3382d59e9c8SKonstantin Ananyev 	},
3392d59e9c8SKonstantin Ananyev 	{
3402d59e9c8SKonstantin Ananyev 		.desc = "MP_RTS/MC_RTS sync mode",
3412d59e9c8SKonstantin Ananyev 		.api_type = TEST_RING_ELEM_BURST | TEST_RING_THREAD_DEF,
3422d59e9c8SKonstantin Ananyev 		.create_flags = RING_F_MP_RTS_ENQ | RING_F_MC_RTS_DEQ,
3432d59e9c8SKonstantin Ananyev 		.enq = {
3442d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_enqueue_burst,
3452d59e9c8SKonstantin Ananyev 			.felem = rte_ring_enqueue_burst_elem,
3462d59e9c8SKonstantin Ananyev 		},
3472d59e9c8SKonstantin Ananyev 		.deq = {
3482d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_dequeue_burst,
3492d59e9c8SKonstantin Ananyev 			.felem = rte_ring_dequeue_burst_elem,
3502d59e9c8SKonstantin Ananyev 		},
3512d59e9c8SKonstantin Ananyev 	},
3522d59e9c8SKonstantin Ananyev 	{
3532d59e9c8SKonstantin Ananyev 		.desc = "MP_HTS/MC_HTS sync mode",
3542d59e9c8SKonstantin Ananyev 		.api_type = TEST_RING_ELEM_BURST | TEST_RING_THREAD_DEF,
3552d59e9c8SKonstantin Ananyev 		.create_flags = RING_F_MP_HTS_ENQ | RING_F_MC_HTS_DEQ,
3562d59e9c8SKonstantin Ananyev 		.enq = {
3572d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_enqueue_burst,
3582d59e9c8SKonstantin Ananyev 			.felem = rte_ring_enqueue_burst_elem,
3592d59e9c8SKonstantin Ananyev 		},
3602d59e9c8SKonstantin Ananyev 		.deq = {
3612d59e9c8SKonstantin Ananyev 			.flegacy = rte_ring_dequeue_burst,
3622d59e9c8SKonstantin Ananyev 			.felem = rte_ring_dequeue_burst_elem,
3632d59e9c8SKonstantin Ananyev 		},
3642d59e9c8SKonstantin Ananyev 	},
36583342a13SHonnappa Nagarahalli 	{
36683342a13SHonnappa Nagarahalli 		.desc = "SP/SC sync mode (ZC)",
36783342a13SHonnappa Nagarahalli 		.api_type = TEST_RING_ELEM_BULK | TEST_RING_THREAD_SPSC,
36883342a13SHonnappa Nagarahalli 		.create_flags = RING_F_SP_ENQ | RING_F_SC_DEQ,
36983342a13SHonnappa Nagarahalli 		.enq = {
37083342a13SHonnappa Nagarahalli 			.flegacy = test_ring_enqueue_zc_bulk,
37183342a13SHonnappa Nagarahalli 			.felem = test_ring_enqueue_zc_bulk_elem,
37283342a13SHonnappa Nagarahalli 		},
37383342a13SHonnappa Nagarahalli 		.deq = {
37483342a13SHonnappa Nagarahalli 			.flegacy = test_ring_dequeue_zc_bulk,
37583342a13SHonnappa Nagarahalli 			.felem = test_ring_dequeue_zc_bulk_elem,
37683342a13SHonnappa Nagarahalli 		},
37783342a13SHonnappa Nagarahalli 	},
37883342a13SHonnappa Nagarahalli 	{
37983342a13SHonnappa Nagarahalli 		.desc = "MP_HTS/MC_HTS sync mode (ZC)",
38083342a13SHonnappa Nagarahalli 		.api_type = TEST_RING_ELEM_BULK | TEST_RING_THREAD_DEF,
38183342a13SHonnappa Nagarahalli 		.create_flags = RING_F_MP_HTS_ENQ | RING_F_MC_HTS_DEQ,
38283342a13SHonnappa Nagarahalli 		.enq = {
38383342a13SHonnappa Nagarahalli 			.flegacy = test_ring_enqueue_zc_bulk,
38483342a13SHonnappa Nagarahalli 			.felem = test_ring_enqueue_zc_bulk_elem,
38583342a13SHonnappa Nagarahalli 		},
38683342a13SHonnappa Nagarahalli 		.deq = {
38783342a13SHonnappa Nagarahalli 			.flegacy = test_ring_dequeue_zc_bulk,
38883342a13SHonnappa Nagarahalli 			.felem = test_ring_dequeue_zc_bulk_elem,
38983342a13SHonnappa Nagarahalli 		},
39083342a13SHonnappa Nagarahalli 	},
39183342a13SHonnappa Nagarahalli 	{
39283342a13SHonnappa Nagarahalli 		.desc = "SP/SC sync mode (ZC)",
39383342a13SHonnappa Nagarahalli 		.api_type = TEST_RING_ELEM_BURST | TEST_RING_THREAD_SPSC,
39483342a13SHonnappa Nagarahalli 		.create_flags = RING_F_SP_ENQ | RING_F_SC_DEQ,
39583342a13SHonnappa Nagarahalli 		.enq = {
39683342a13SHonnappa Nagarahalli 			.flegacy = test_ring_enqueue_zc_burst,
39783342a13SHonnappa Nagarahalli 			.felem = test_ring_enqueue_zc_burst_elem,
39883342a13SHonnappa Nagarahalli 		},
39983342a13SHonnappa Nagarahalli 		.deq = {
40083342a13SHonnappa Nagarahalli 			.flegacy = test_ring_dequeue_zc_burst,
40183342a13SHonnappa Nagarahalli 			.felem = test_ring_dequeue_zc_burst_elem,
40283342a13SHonnappa Nagarahalli 		},
40383342a13SHonnappa Nagarahalli 	},
40483342a13SHonnappa Nagarahalli 	{
40583342a13SHonnappa Nagarahalli 		.desc = "MP_HTS/MC_HTS sync mode (ZC)",
40683342a13SHonnappa Nagarahalli 		.api_type = TEST_RING_ELEM_BURST | TEST_RING_THREAD_DEF,
40783342a13SHonnappa Nagarahalli 		.create_flags = RING_F_MP_HTS_ENQ | RING_F_MC_HTS_DEQ,
40883342a13SHonnappa Nagarahalli 		.enq = {
40983342a13SHonnappa Nagarahalli 			.flegacy = test_ring_enqueue_zc_burst,
41083342a13SHonnappa Nagarahalli 			.felem = test_ring_enqueue_zc_burst_elem,
41183342a13SHonnappa Nagarahalli 		},
41283342a13SHonnappa Nagarahalli 		.deq = {
41383342a13SHonnappa Nagarahalli 			.flegacy = test_ring_dequeue_zc_burst,
41483342a13SHonnappa Nagarahalli 			.felem = test_ring_dequeue_zc_burst_elem,
41583342a13SHonnappa Nagarahalli 		},
41683342a13SHonnappa Nagarahalli 	}
4172d59e9c8SKonstantin Ananyev };
4182d59e9c8SKonstantin Ananyev 
4192d59e9c8SKonstantin Ananyev static unsigned int
test_ring_enq_impl(struct rte_ring * r,void ** obj,int esize,unsigned int n,unsigned int test_idx)4202d59e9c8SKonstantin Ananyev test_ring_enq_impl(struct rte_ring *r, void **obj, int esize, unsigned int n,
4212d59e9c8SKonstantin Ananyev 	unsigned int test_idx)
4222d59e9c8SKonstantin Ananyev {
4232d59e9c8SKonstantin Ananyev 	if (esize == -1)
4242d59e9c8SKonstantin Ananyev 		return test_enqdeq_impl[test_idx].enq.flegacy(r, obj, n, NULL);
4252d59e9c8SKonstantin Ananyev 	else
4262d59e9c8SKonstantin Ananyev 		return test_enqdeq_impl[test_idx].enq.felem(r, obj, esize, n,
4272d59e9c8SKonstantin Ananyev 			NULL);
4282d59e9c8SKonstantin Ananyev }
4292d59e9c8SKonstantin Ananyev 
4302d59e9c8SKonstantin Ananyev static unsigned int
test_ring_deq_impl(struct rte_ring * r,void ** obj,int esize,unsigned int n,unsigned int test_idx)4312d59e9c8SKonstantin Ananyev test_ring_deq_impl(struct rte_ring *r, void **obj, int esize, unsigned int n,
4322d59e9c8SKonstantin Ananyev 	unsigned int test_idx)
4332d59e9c8SKonstantin Ananyev {
4342d59e9c8SKonstantin Ananyev 	if (esize == -1)
4352d59e9c8SKonstantin Ananyev 		return test_enqdeq_impl[test_idx].deq.flegacy(r, obj, n, NULL);
4362d59e9c8SKonstantin Ananyev 	else
4372d59e9c8SKonstantin Ananyev 		return test_enqdeq_impl[test_idx].deq.felem(r, obj, esize, n,
4382d59e9c8SKonstantin Ananyev 			NULL);
4392d59e9c8SKonstantin Ananyev }
4402d59e9c8SKonstantin Ananyev 
441a9fe1523SHonnappa Nagarahalli static void
test_ring_mem_init(void * obj,unsigned int count,int esize)442a9fe1523SHonnappa Nagarahalli test_ring_mem_init(void *obj, unsigned int count, int esize)
443a9fe1523SHonnappa Nagarahalli {
444a9fe1523SHonnappa Nagarahalli 	unsigned int i;
445a9fe1523SHonnappa Nagarahalli 
446a9fe1523SHonnappa Nagarahalli 	/* Legacy queue APIs? */
447a9fe1523SHonnappa Nagarahalli 	if (esize == -1)
448a9fe1523SHonnappa Nagarahalli 		for (i = 0; i < count; i++)
4496c341665SHonnappa Nagarahalli 			((void **)obj)[i] = (void *)(uintptr_t)i;
450a9fe1523SHonnappa Nagarahalli 	else
451a9fe1523SHonnappa Nagarahalli 		for (i = 0; i < (count * esize / sizeof(uint32_t)); i++)
452a9fe1523SHonnappa Nagarahalli 			((uint32_t *)obj)[i] = i;
453a9fe1523SHonnappa Nagarahalli }
454a9fe1523SHonnappa Nagarahalli 
4556c583103SFeifei Wang static int
test_ring_mem_cmp(void * src,void * dst,unsigned int size)4566c583103SFeifei Wang test_ring_mem_cmp(void *src, void *dst, unsigned int size)
4576c583103SFeifei Wang {
4586c583103SFeifei Wang 	int ret;
4596c583103SFeifei Wang 
4606c583103SFeifei Wang 	ret = memcmp(src, dst, size);
4616c583103SFeifei Wang 	if (ret) {
4626c583103SFeifei Wang 		rte_hexdump(stdout, "src", src, size);
4636c583103SFeifei Wang 		rte_hexdump(stdout, "dst", dst, size);
4646c583103SFeifei Wang 		printf("data after dequeue is not the same\n");
4656c583103SFeifei Wang 	}
4666c583103SFeifei Wang 
4676c583103SFeifei Wang 	return ret;
4686c583103SFeifei Wang }
4696c583103SFeifei Wang 
470a9fe1523SHonnappa Nagarahalli static void
test_ring_print_test_string(const char * istr,unsigned int api_type,int esize)471a9fe1523SHonnappa Nagarahalli test_ring_print_test_string(const char *istr, unsigned int api_type, int esize)
472a9fe1523SHonnappa Nagarahalli {
473a9fe1523SHonnappa Nagarahalli 	printf("\n%s: ", istr);
474a9fe1523SHonnappa Nagarahalli 
475a9fe1523SHonnappa Nagarahalli 	if (esize == -1)
476a9fe1523SHonnappa Nagarahalli 		printf("legacy APIs: ");
477a9fe1523SHonnappa Nagarahalli 	else
478a9fe1523SHonnappa Nagarahalli 		printf("elem APIs: element size %dB ", esize);
479a9fe1523SHonnappa Nagarahalli 
480a9fe1523SHonnappa Nagarahalli 	if (api_type == TEST_RING_IGNORE_API_TYPE)
481a9fe1523SHonnappa Nagarahalli 		return;
482a9fe1523SHonnappa Nagarahalli 
483a9fe1523SHonnappa Nagarahalli 	if (api_type & TEST_RING_THREAD_DEF)
484a9fe1523SHonnappa Nagarahalli 		printf(": default enqueue/dequeue: ");
485a9fe1523SHonnappa Nagarahalli 	else if (api_type & TEST_RING_THREAD_SPSC)
486a9fe1523SHonnappa Nagarahalli 		printf(": SP/SC: ");
487a9fe1523SHonnappa Nagarahalli 	else if (api_type & TEST_RING_THREAD_MPMC)
488a9fe1523SHonnappa Nagarahalli 		printf(": MP/MC: ");
489a9fe1523SHonnappa Nagarahalli 
490a9fe1523SHonnappa Nagarahalli 	if (api_type & TEST_RING_ELEM_SINGLE)
491a9fe1523SHonnappa Nagarahalli 		printf("single\n");
492a9fe1523SHonnappa Nagarahalli 	else if (api_type & TEST_RING_ELEM_BULK)
493a9fe1523SHonnappa Nagarahalli 		printf("bulk\n");
494a9fe1523SHonnappa Nagarahalli 	else if (api_type & TEST_RING_ELEM_BURST)
495a9fe1523SHonnappa Nagarahalli 		printf("burst\n");
496a9fe1523SHonnappa Nagarahalli }
497a9fe1523SHonnappa Nagarahalli 
498a9de470cSBruce Richardson /*
499a9fe1523SHonnappa Nagarahalli  * Various negative test cases.
500a9de470cSBruce Richardson  */
501a9de470cSBruce Richardson static int
test_ring_negative_tests(void)502a9fe1523SHonnappa Nagarahalli test_ring_negative_tests(void)
503a9de470cSBruce Richardson {
504a9fe1523SHonnappa Nagarahalli 	struct rte_ring *rp = NULL;
505a9fe1523SHonnappa Nagarahalli 	struct rte_ring *rt = NULL;
506a9fe1523SHonnappa Nagarahalli 	unsigned int i;
507a9de470cSBruce Richardson 
508a9fe1523SHonnappa Nagarahalli 	/* Test with esize not a multiple of 4 */
509a9fe1523SHonnappa Nagarahalli 	rp = test_ring_create("test_bad_element_size", 23,
510a9fe1523SHonnappa Nagarahalli 				RING_SIZE + 1, SOCKET_ID_ANY, 0);
511a9fe1523SHonnappa Nagarahalli 	if (rp != NULL) {
512a9fe1523SHonnappa Nagarahalli 		printf("Test failed to detect invalid element size\n");
513a9fe1523SHonnappa Nagarahalli 		goto test_fail;
514a9fe1523SHonnappa Nagarahalli 	}
515a9de470cSBruce Richardson 
516a9de470cSBruce Richardson 
517a9fe1523SHonnappa Nagarahalli 	for (i = 0; i < RTE_DIM(esize); i++) {
518a9fe1523SHonnappa Nagarahalli 		/* Test if ring size is not power of 2 */
519a9fe1523SHonnappa Nagarahalli 		rp = test_ring_create("test_bad_ring_size", esize[i],
520a9fe1523SHonnappa Nagarahalli 					RING_SIZE + 1, SOCKET_ID_ANY, 0);
521a9fe1523SHonnappa Nagarahalli 		if (rp != NULL) {
522a9fe1523SHonnappa Nagarahalli 			printf("Test failed to detect odd count\n");
523a9fe1523SHonnappa Nagarahalli 			goto test_fail;
524a9fe1523SHonnappa Nagarahalli 		}
525a9fe1523SHonnappa Nagarahalli 
526a9fe1523SHonnappa Nagarahalli 		/* Test if ring size is exceeding the limit */
527a9fe1523SHonnappa Nagarahalli 		rp = test_ring_create("test_bad_ring_size", esize[i],
528a9fe1523SHonnappa Nagarahalli 					RTE_RING_SZ_MASK + 1, SOCKET_ID_ANY, 0);
529a9fe1523SHonnappa Nagarahalli 		if (rp != NULL) {
530a9fe1523SHonnappa Nagarahalli 			printf("Test failed to detect limits\n");
531a9fe1523SHonnappa Nagarahalli 			goto test_fail;
532a9fe1523SHonnappa Nagarahalli 		}
533a9fe1523SHonnappa Nagarahalli 
534a9fe1523SHonnappa Nagarahalli 		/* Tests if lookup returns NULL on non-existing ring */
535a9fe1523SHonnappa Nagarahalli 		rp = rte_ring_lookup("ring_not_found");
536a9fe1523SHonnappa Nagarahalli 		if (rp != NULL && rte_errno != ENOENT) {
537a9fe1523SHonnappa Nagarahalli 			printf("Test failed to detect NULL ring lookup\n");
538a9fe1523SHonnappa Nagarahalli 			goto test_fail;
539a9fe1523SHonnappa Nagarahalli 		}
540a9fe1523SHonnappa Nagarahalli 
541a9fe1523SHonnappa Nagarahalli 		/* Test to if a non-power of 2 count causes the create
542a9fe1523SHonnappa Nagarahalli 		 * function to fail correctly
543a9fe1523SHonnappa Nagarahalli 		 */
544a9fe1523SHonnappa Nagarahalli 		rp = test_ring_create("test_ring_count", esize[i], 4097,
545a9fe1523SHonnappa Nagarahalli 					SOCKET_ID_ANY, 0);
546a9fe1523SHonnappa Nagarahalli 		if (rp != NULL)
547a9fe1523SHonnappa Nagarahalli 			goto test_fail;
548a9fe1523SHonnappa Nagarahalli 
549a9fe1523SHonnappa Nagarahalli 		rp = test_ring_create("test_ring_negative", esize[i], RING_SIZE,
550a9fe1523SHonnappa Nagarahalli 					SOCKET_ID_ANY,
551a9fe1523SHonnappa Nagarahalli 					RING_F_SP_ENQ | RING_F_SC_DEQ);
552a9fe1523SHonnappa Nagarahalli 		if (rp == NULL) {
553a9fe1523SHonnappa Nagarahalli 			printf("test_ring_negative fail to create ring\n");
554a9fe1523SHonnappa Nagarahalli 			goto test_fail;
555a9fe1523SHonnappa Nagarahalli 		}
556a9fe1523SHonnappa Nagarahalli 
55746697431SFeifei Wang 		TEST_RING_VERIFY(rte_ring_lookup("test_ring_negative") == rp,
55846697431SFeifei Wang 					rp, goto test_fail);
559a9fe1523SHonnappa Nagarahalli 
56046697431SFeifei Wang 		TEST_RING_VERIFY(rte_ring_empty(rp) == 1, rp, goto test_fail);
561a9fe1523SHonnappa Nagarahalli 
562a9fe1523SHonnappa Nagarahalli 		/* Tests if it would always fail to create ring with an used
563a9fe1523SHonnappa Nagarahalli 		 * ring name.
564a9fe1523SHonnappa Nagarahalli 		 */
565a9fe1523SHonnappa Nagarahalli 		rt = test_ring_create("test_ring_negative", esize[i], RING_SIZE,
566a9fe1523SHonnappa Nagarahalli 					SOCKET_ID_ANY, 0);
567a9fe1523SHonnappa Nagarahalli 		if (rt != NULL)
568a9fe1523SHonnappa Nagarahalli 			goto test_fail;
569a9fe1523SHonnappa Nagarahalli 
570a9fe1523SHonnappa Nagarahalli 		rte_ring_free(rp);
571a9fe1523SHonnappa Nagarahalli 		rp = NULL;
572a9fe1523SHonnappa Nagarahalli 	}
573a9fe1523SHonnappa Nagarahalli 
574a9fe1523SHonnappa Nagarahalli 	return 0;
575a9fe1523SHonnappa Nagarahalli 
576a9fe1523SHonnappa Nagarahalli test_fail:
577a9fe1523SHonnappa Nagarahalli 
578a9fe1523SHonnappa Nagarahalli 	rte_ring_free(rp);
579a9fe1523SHonnappa Nagarahalli 	return -1;
580a9fe1523SHonnappa Nagarahalli }
581a9fe1523SHonnappa Nagarahalli 
582a9fe1523SHonnappa Nagarahalli /*
583a9fe1523SHonnappa Nagarahalli  * Burst and bulk operations with sp/sc, mp/mc and default (during creation)
584a9fe1523SHonnappa Nagarahalli  * Random number of elements are enqueued and dequeued.
585a9fe1523SHonnappa Nagarahalli  */
586a9fe1523SHonnappa Nagarahalli static int
test_ring_burst_bulk_tests1(unsigned int test_idx)5872d59e9c8SKonstantin Ananyev test_ring_burst_bulk_tests1(unsigned int test_idx)
588a9fe1523SHonnappa Nagarahalli {
589a9fe1523SHonnappa Nagarahalli 	struct rte_ring *r;
590a9fe1523SHonnappa Nagarahalli 	void **src = NULL, **cur_src = NULL, **dst = NULL, **cur_dst = NULL;
591a9fe1523SHonnappa Nagarahalli 	int ret;
5926c583103SFeifei Wang 	unsigned int i, j, temp_sz;
593a9fe1523SHonnappa Nagarahalli 	int rand;
594a9fe1523SHonnappa Nagarahalli 	const unsigned int rsz = RING_SIZE - 1;
595a9fe1523SHonnappa Nagarahalli 
596a9fe1523SHonnappa Nagarahalli 	for (i = 0; i < RTE_DIM(esize); i++) {
5972d59e9c8SKonstantin Ananyev 		test_ring_print_test_string(test_enqdeq_impl[test_idx].desc,
5982d59e9c8SKonstantin Ananyev 			test_enqdeq_impl[test_idx].api_type, esize[i]);
599a9fe1523SHonnappa Nagarahalli 
600a9fe1523SHonnappa Nagarahalli 		/* Create the ring */
601a9fe1523SHonnappa Nagarahalli 		r = test_ring_create("test_ring_burst_bulk_tests", esize[i],
6022d59e9c8SKonstantin Ananyev 				RING_SIZE, SOCKET_ID_ANY,
6032d59e9c8SKonstantin Ananyev 				test_enqdeq_impl[test_idx].create_flags);
604a9fe1523SHonnappa Nagarahalli 
605a9fe1523SHonnappa Nagarahalli 		/* alloc dummy object pointers */
606a9fe1523SHonnappa Nagarahalli 		src = test_ring_calloc(RING_SIZE * 2, esize[i]);
607a9fe1523SHonnappa Nagarahalli 		if (src == NULL)
608a9fe1523SHonnappa Nagarahalli 			goto fail;
609a9fe1523SHonnappa Nagarahalli 		test_ring_mem_init(src, RING_SIZE * 2, esize[i]);
610a9fe1523SHonnappa Nagarahalli 		cur_src = src;
611a9fe1523SHonnappa Nagarahalli 
612a9fe1523SHonnappa Nagarahalli 		/* alloc some room for copied objects */
613a9fe1523SHonnappa Nagarahalli 		dst = test_ring_calloc(RING_SIZE * 2, esize[i]);
614a9fe1523SHonnappa Nagarahalli 		if (dst == NULL)
615a9fe1523SHonnappa Nagarahalli 			goto fail;
616a9fe1523SHonnappa Nagarahalli 		cur_dst = dst;
617a9fe1523SHonnappa Nagarahalli 
618a9fe1523SHonnappa Nagarahalli 		printf("Random full/empty test\n");
619a9fe1523SHonnappa Nagarahalli 
62046697431SFeifei Wang 		for (j = 0; j != TEST_RING_FULL_EMPTY_ITER; j++) {
621a9de470cSBruce Richardson 			/* random shift in the ring */
622a9de470cSBruce Richardson 			rand = RTE_MAX(rte_rand() % RING_SIZE, 1UL);
623a9de470cSBruce Richardson 			printf("%s: iteration %u, random shift: %u;\n",
624a9de470cSBruce Richardson 			    __func__, i, rand);
6252d59e9c8SKonstantin Ananyev 			ret = test_ring_enq_impl(r, cur_src, esize[i], rand,
6262d59e9c8SKonstantin Ananyev 							test_idx);
62746697431SFeifei Wang 			TEST_RING_VERIFY(ret != 0, r, goto fail);
628a9fe1523SHonnappa Nagarahalli 
6292d59e9c8SKonstantin Ananyev 			ret = test_ring_deq_impl(r, cur_dst, esize[i], rand,
6302d59e9c8SKonstantin Ananyev 							test_idx);
63146697431SFeifei Wang 			TEST_RING_VERIFY(ret == rand, r, goto fail);
632a9de470cSBruce Richardson 
633a9de470cSBruce Richardson 			/* fill the ring */
6342d59e9c8SKonstantin Ananyev 			ret = test_ring_enq_impl(r, cur_src, esize[i], rsz,
6352d59e9c8SKonstantin Ananyev 							test_idx);
63646697431SFeifei Wang 			TEST_RING_VERIFY(ret != 0, r, goto fail);
637a9fe1523SHonnappa Nagarahalli 
63846697431SFeifei Wang 			TEST_RING_VERIFY(rte_ring_free_count(r) == 0, r, goto fail);
63946697431SFeifei Wang 			TEST_RING_VERIFY(rsz == rte_ring_count(r), r, goto fail);
64046697431SFeifei Wang 			TEST_RING_VERIFY(rte_ring_full(r), r, goto fail);
64146697431SFeifei Wang 			TEST_RING_VERIFY(rte_ring_empty(r) == 0, r, goto fail);
642a9de470cSBruce Richardson 
643a9de470cSBruce Richardson 			/* empty the ring */
6442d59e9c8SKonstantin Ananyev 			ret = test_ring_deq_impl(r, cur_dst, esize[i], rsz,
6452d59e9c8SKonstantin Ananyev 							test_idx);
64646697431SFeifei Wang 			TEST_RING_VERIFY(ret == (int)rsz, r, goto fail);
64746697431SFeifei Wang 
64846697431SFeifei Wang 			TEST_RING_VERIFY(rsz == rte_ring_free_count(r), r, goto fail);
64946697431SFeifei Wang 			TEST_RING_VERIFY(rte_ring_count(r) == 0, r, goto fail);
65046697431SFeifei Wang 			TEST_RING_VERIFY(rte_ring_full(r) == 0, r, goto fail);
65146697431SFeifei Wang 			TEST_RING_VERIFY(rte_ring_empty(r), r, goto fail);
652a9de470cSBruce Richardson 
653a9de470cSBruce Richardson 			/* check data */
6546c583103SFeifei Wang 			temp_sz = rsz * sizeof(void *);
6556c583103SFeifei Wang 			if (esize[i] != -1)
6566c583103SFeifei Wang 				temp_sz = rsz * esize[i];
6576c583103SFeifei Wang 			TEST_RING_VERIFY(test_ring_mem_cmp(src, dst,
65846697431SFeifei Wang 						temp_sz) == 0, r, goto fail);
659a9de470cSBruce Richardson 		}
660a9fe1523SHonnappa Nagarahalli 
661a9fe1523SHonnappa Nagarahalli 		/* Free memory before test completed */
662a9fe1523SHonnappa Nagarahalli 		rte_ring_free(r);
663a9fe1523SHonnappa Nagarahalli 		rte_free(src);
664a9fe1523SHonnappa Nagarahalli 		rte_free(dst);
665a9fe1523SHonnappa Nagarahalli 		r = NULL;
666a9fe1523SHonnappa Nagarahalli 		src = NULL;
667a9fe1523SHonnappa Nagarahalli 		dst = NULL;
668a9fe1523SHonnappa Nagarahalli 	}
669a9fe1523SHonnappa Nagarahalli 
670a9de470cSBruce Richardson 	return 0;
671a9de470cSBruce Richardson fail:
672a9fe1523SHonnappa Nagarahalli 	rte_ring_free(r);
673a9fe1523SHonnappa Nagarahalli 	rte_free(src);
674a9fe1523SHonnappa Nagarahalli 	rte_free(dst);
675a9de470cSBruce Richardson 	return -1;
676a9de470cSBruce Richardson }
677a9de470cSBruce Richardson 
678a9fe1523SHonnappa Nagarahalli /*
679a9fe1523SHonnappa Nagarahalli  * Burst and bulk operations with sp/sc, mp/mc and default (during creation)
680a9fe1523SHonnappa Nagarahalli  * Sequence of simple enqueues/dequeues and validate the enqueued and
681a9fe1523SHonnappa Nagarahalli  * dequeued data.
682a9fe1523SHonnappa Nagarahalli  */
683a9de470cSBruce Richardson static int
test_ring_burst_bulk_tests2(unsigned int test_idx)6842d59e9c8SKonstantin Ananyev test_ring_burst_bulk_tests2(unsigned int test_idx)
685a9de470cSBruce Richardson {
686a9fe1523SHonnappa Nagarahalli 	struct rte_ring *r;
687a9de470cSBruce Richardson 	void **src = NULL, **cur_src = NULL, **dst = NULL, **cur_dst = NULL;
688a9de470cSBruce Richardson 	int ret;
689a9fe1523SHonnappa Nagarahalli 	unsigned int i;
690a9fe1523SHonnappa Nagarahalli 
691a9fe1523SHonnappa Nagarahalli 	for (i = 0; i < RTE_DIM(esize); i++) {
6922d59e9c8SKonstantin Ananyev 		test_ring_print_test_string(test_enqdeq_impl[test_idx].desc,
6932d59e9c8SKonstantin Ananyev 			test_enqdeq_impl[test_idx].api_type, esize[i]);
694a9fe1523SHonnappa Nagarahalli 
695a9fe1523SHonnappa Nagarahalli 		/* Create the ring */
696a9fe1523SHonnappa Nagarahalli 		r = test_ring_create("test_ring_burst_bulk_tests", esize[i],
6972d59e9c8SKonstantin Ananyev 				RING_SIZE, SOCKET_ID_ANY,
6982d59e9c8SKonstantin Ananyev 				test_enqdeq_impl[test_idx].create_flags);
699a9de470cSBruce Richardson 
700a9de470cSBruce Richardson 		/* alloc dummy object pointers */
701a9fe1523SHonnappa Nagarahalli 		src = test_ring_calloc(RING_SIZE * 2, esize[i]);
702a9de470cSBruce Richardson 		if (src == NULL)
703a9de470cSBruce Richardson 			goto fail;
704a9fe1523SHonnappa Nagarahalli 		test_ring_mem_init(src, RING_SIZE * 2, esize[i]);
705a9de470cSBruce Richardson 		cur_src = src;
706a9de470cSBruce Richardson 
707a9de470cSBruce Richardson 		/* alloc some room for copied objects */
708a9fe1523SHonnappa Nagarahalli 		dst = test_ring_calloc(RING_SIZE * 2, esize[i]);
709a9de470cSBruce Richardson 		if (dst == NULL)
710a9de470cSBruce Richardson 			goto fail;
711a9de470cSBruce Richardson 		cur_dst = dst;
712a9de470cSBruce Richardson 
713a9de470cSBruce Richardson 		printf("enqueue 1 obj\n");
7142d59e9c8SKonstantin Ananyev 		ret = test_ring_enq_impl(r, cur_src, esize[i], 1, test_idx);
71546697431SFeifei Wang 		TEST_RING_VERIFY(ret == 1, r, goto fail);
716a9fe1523SHonnappa Nagarahalli 		cur_src = test_ring_inc_ptr(cur_src, esize[i], 1);
717a9de470cSBruce Richardson 
718a9de470cSBruce Richardson 		printf("enqueue 2 objs\n");
7192d59e9c8SKonstantin Ananyev 		ret = test_ring_enq_impl(r, cur_src, esize[i], 2, test_idx);
72046697431SFeifei Wang 		TEST_RING_VERIFY(ret == 2, r, goto fail);
721a9fe1523SHonnappa Nagarahalli 		cur_src = test_ring_inc_ptr(cur_src, esize[i], 2);
722a9de470cSBruce Richardson 
723a9de470cSBruce Richardson 		printf("enqueue MAX_BULK objs\n");
7242d59e9c8SKonstantin Ananyev 		ret = test_ring_enq_impl(r, cur_src, esize[i], MAX_BULK,
7252d59e9c8SKonstantin Ananyev 						test_idx);
72646697431SFeifei Wang 		TEST_RING_VERIFY(ret == MAX_BULK, r, goto fail);
727a9de470cSBruce Richardson 
728a9de470cSBruce Richardson 		printf("dequeue 1 obj\n");
7292d59e9c8SKonstantin Ananyev 		ret = test_ring_deq_impl(r, cur_dst, esize[i], 1, test_idx);
73046697431SFeifei Wang 		TEST_RING_VERIFY(ret == 1, r, goto fail);
731a9fe1523SHonnappa Nagarahalli 		cur_dst = test_ring_inc_ptr(cur_dst, esize[i], 1);
732a9de470cSBruce Richardson 
733a9de470cSBruce Richardson 		printf("dequeue 2 objs\n");
7342d59e9c8SKonstantin Ananyev 		ret = test_ring_deq_impl(r, cur_dst, esize[i], 2, test_idx);
73546697431SFeifei Wang 		TEST_RING_VERIFY(ret == 2, r, goto fail);
736a9fe1523SHonnappa Nagarahalli 		cur_dst = test_ring_inc_ptr(cur_dst, esize[i], 2);
737a9de470cSBruce Richardson 
738a9de470cSBruce Richardson 		printf("dequeue MAX_BULK objs\n");
7392d59e9c8SKonstantin Ananyev 		ret = test_ring_deq_impl(r, cur_dst, esize[i], MAX_BULK,
7402d59e9c8SKonstantin Ananyev 						test_idx);
74146697431SFeifei Wang 		TEST_RING_VERIFY(ret == MAX_BULK, r, goto fail);
742a9fe1523SHonnappa Nagarahalli 		cur_dst = test_ring_inc_ptr(cur_dst, esize[i], MAX_BULK);
743a9de470cSBruce Richardson 
744a9de470cSBruce Richardson 		/* check data */
74546697431SFeifei Wang 		TEST_RING_VERIFY(test_ring_mem_cmp(src, dst,
74646697431SFeifei Wang 					RTE_PTR_DIFF(cur_dst, dst)) == 0,
74746697431SFeifei Wang 					r, goto fail);
748a9de470cSBruce Richardson 
749a9fe1523SHonnappa Nagarahalli 		/* Free memory before test completed */
750a9fe1523SHonnappa Nagarahalli 		rte_ring_free(r);
751a9fe1523SHonnappa Nagarahalli 		rte_free(src);
752a9fe1523SHonnappa Nagarahalli 		rte_free(dst);
753a9fe1523SHonnappa Nagarahalli 		r = NULL;
754a9fe1523SHonnappa Nagarahalli 		src = NULL;
755a9fe1523SHonnappa Nagarahalli 		dst = NULL;
756a9fe1523SHonnappa Nagarahalli 	}
757a9fe1523SHonnappa Nagarahalli 
758a9fe1523SHonnappa Nagarahalli 	return 0;
759a9fe1523SHonnappa Nagarahalli fail:
760a9fe1523SHonnappa Nagarahalli 	rte_ring_free(r);
761a9fe1523SHonnappa Nagarahalli 	rte_free(src);
762a9fe1523SHonnappa Nagarahalli 	rte_free(dst);
763a9fe1523SHonnappa Nagarahalli 	return -1;
764a9fe1523SHonnappa Nagarahalli }
765a9fe1523SHonnappa Nagarahalli 
766a9fe1523SHonnappa Nagarahalli /*
767a9fe1523SHonnappa Nagarahalli  * Burst and bulk operations with sp/sc, mp/mc and default (during creation)
768a9fe1523SHonnappa Nagarahalli  * Enqueue and dequeue to cover the entire ring length.
769a9fe1523SHonnappa Nagarahalli  */
770a9fe1523SHonnappa Nagarahalli static int
test_ring_burst_bulk_tests3(unsigned int test_idx)7712d59e9c8SKonstantin Ananyev test_ring_burst_bulk_tests3(unsigned int test_idx)
772a9fe1523SHonnappa Nagarahalli {
773a9fe1523SHonnappa Nagarahalli 	struct rte_ring *r;
774a9fe1523SHonnappa Nagarahalli 	void **src = NULL, **cur_src = NULL, **dst = NULL, **cur_dst = NULL;
775a9fe1523SHonnappa Nagarahalli 	int ret;
776a9fe1523SHonnappa Nagarahalli 	unsigned int i, j;
777a9fe1523SHonnappa Nagarahalli 
778a9fe1523SHonnappa Nagarahalli 	for (i = 0; i < RTE_DIM(esize); i++) {
7792d59e9c8SKonstantin Ananyev 		test_ring_print_test_string(test_enqdeq_impl[test_idx].desc,
7802d59e9c8SKonstantin Ananyev 			test_enqdeq_impl[test_idx].api_type, esize[i]);
781a9fe1523SHonnappa Nagarahalli 
782a9fe1523SHonnappa Nagarahalli 		/* Create the ring */
783a9fe1523SHonnappa Nagarahalli 		r = test_ring_create("test_ring_burst_bulk_tests", esize[i],
7842d59e9c8SKonstantin Ananyev 				RING_SIZE, SOCKET_ID_ANY,
7852d59e9c8SKonstantin Ananyev 				test_enqdeq_impl[test_idx].create_flags);
786a9fe1523SHonnappa Nagarahalli 
787a9fe1523SHonnappa Nagarahalli 		/* alloc dummy object pointers */
788a9fe1523SHonnappa Nagarahalli 		src = test_ring_calloc(RING_SIZE * 2, esize[i]);
789a9fe1523SHonnappa Nagarahalli 		if (src == NULL)
790a9fe1523SHonnappa Nagarahalli 			goto fail;
791a9fe1523SHonnappa Nagarahalli 		test_ring_mem_init(src, RING_SIZE * 2, esize[i]);
792a9de470cSBruce Richardson 		cur_src = src;
793a9fe1523SHonnappa Nagarahalli 
794a9fe1523SHonnappa Nagarahalli 		/* alloc some room for copied objects */
795a9fe1523SHonnappa Nagarahalli 		dst = test_ring_calloc(RING_SIZE * 2, esize[i]);
796a9fe1523SHonnappa Nagarahalli 		if (dst == NULL)
797a9fe1523SHonnappa Nagarahalli 			goto fail;
798a9de470cSBruce Richardson 		cur_dst = dst;
799a9de470cSBruce Richardson 
800a9fe1523SHonnappa Nagarahalli 		printf("fill and empty the ring\n");
801a9fe1523SHonnappa Nagarahalli 		for (j = 0; j < RING_SIZE / MAX_BULK; j++) {
8022d59e9c8SKonstantin Ananyev 			ret = test_ring_enq_impl(r, cur_src, esize[i], MAX_BULK,
8032d59e9c8SKonstantin Ananyev 							test_idx);
80446697431SFeifei Wang 			TEST_RING_VERIFY(ret == MAX_BULK, r, goto fail);
805a9fe1523SHonnappa Nagarahalli 			cur_src = test_ring_inc_ptr(cur_src, esize[i],
806a9fe1523SHonnappa Nagarahalli 								MAX_BULK);
807a9fe1523SHonnappa Nagarahalli 
8082d59e9c8SKonstantin Ananyev 			ret = test_ring_deq_impl(r, cur_dst, esize[i], MAX_BULK,
8092d59e9c8SKonstantin Ananyev 							test_idx);
81046697431SFeifei Wang 			TEST_RING_VERIFY(ret == MAX_BULK, r, goto fail);
811a9fe1523SHonnappa Nagarahalli 			cur_dst = test_ring_inc_ptr(cur_dst, esize[i],
812a9fe1523SHonnappa Nagarahalli 								MAX_BULK);
813a9fe1523SHonnappa Nagarahalli 		}
814a9fe1523SHonnappa Nagarahalli 
815a9fe1523SHonnappa Nagarahalli 		/* check data */
81646697431SFeifei Wang 		TEST_RING_VERIFY(test_ring_mem_cmp(src, dst,
81746697431SFeifei Wang 					RTE_PTR_DIFF(cur_dst, dst)) == 0,
81846697431SFeifei Wang 					r, goto fail);
819a9de470cSBruce Richardson 
820a9fe1523SHonnappa Nagarahalli 		/* Free memory before test completed */
821a9fe1523SHonnappa Nagarahalli 		rte_ring_free(r);
822a9fe1523SHonnappa Nagarahalli 		rte_free(src);
823a9fe1523SHonnappa Nagarahalli 		rte_free(dst);
824a9fe1523SHonnappa Nagarahalli 		r = NULL;
825a9fe1523SHonnappa Nagarahalli 		src = NULL;
826a9fe1523SHonnappa Nagarahalli 		dst = NULL;
827a9fe1523SHonnappa Nagarahalli 	}
828a9fe1523SHonnappa Nagarahalli 
829a9fe1523SHonnappa Nagarahalli 	return 0;
830a9fe1523SHonnappa Nagarahalli fail:
831a9fe1523SHonnappa Nagarahalli 	rte_ring_free(r);
832a9fe1523SHonnappa Nagarahalli 	rte_free(src);
833a9fe1523SHonnappa Nagarahalli 	rte_free(dst);
834a9fe1523SHonnappa Nagarahalli 	return -1;
835a9fe1523SHonnappa Nagarahalli }
836a9fe1523SHonnappa Nagarahalli 
837a9fe1523SHonnappa Nagarahalli /*
838a9fe1523SHonnappa Nagarahalli  * Burst and bulk operations with sp/sc, mp/mc and default (during creation)
839a9fe1523SHonnappa Nagarahalli  * Enqueue till the ring is full and dequeue till the ring becomes empty.
840a9fe1523SHonnappa Nagarahalli  */
841a9fe1523SHonnappa Nagarahalli static int
test_ring_burst_bulk_tests4(unsigned int test_idx)8422d59e9c8SKonstantin Ananyev test_ring_burst_bulk_tests4(unsigned int test_idx)
843a9fe1523SHonnappa Nagarahalli {
844a9fe1523SHonnappa Nagarahalli 	struct rte_ring *r;
845a9fe1523SHonnappa Nagarahalli 	void **src = NULL, **cur_src = NULL, **dst = NULL, **cur_dst = NULL;
846a9fe1523SHonnappa Nagarahalli 	int ret;
847a9fe1523SHonnappa Nagarahalli 	unsigned int i, j;
8482d59e9c8SKonstantin Ananyev 	unsigned int api_type, num_elems;
8492d59e9c8SKonstantin Ananyev 
8502d59e9c8SKonstantin Ananyev 	api_type = test_enqdeq_impl[test_idx].api_type;
851a9fe1523SHonnappa Nagarahalli 
852a9fe1523SHonnappa Nagarahalli 	for (i = 0; i < RTE_DIM(esize); i++) {
8532d59e9c8SKonstantin Ananyev 		test_ring_print_test_string(test_enqdeq_impl[test_idx].desc,
8542d59e9c8SKonstantin Ananyev 			test_enqdeq_impl[test_idx].api_type, esize[i]);
855a9fe1523SHonnappa Nagarahalli 
856a9fe1523SHonnappa Nagarahalli 		/* Create the ring */
857a9fe1523SHonnappa Nagarahalli 		r = test_ring_create("test_ring_burst_bulk_tests", esize[i],
8582d59e9c8SKonstantin Ananyev 				RING_SIZE, SOCKET_ID_ANY,
8592d59e9c8SKonstantin Ananyev 				test_enqdeq_impl[test_idx].create_flags);
860a9fe1523SHonnappa Nagarahalli 
861a9fe1523SHonnappa Nagarahalli 		/* alloc dummy object pointers */
862a9fe1523SHonnappa Nagarahalli 		src = test_ring_calloc(RING_SIZE * 2, esize[i]);
863a9fe1523SHonnappa Nagarahalli 		if (src == NULL)
864a9fe1523SHonnappa Nagarahalli 			goto fail;
865a9fe1523SHonnappa Nagarahalli 		test_ring_mem_init(src, RING_SIZE * 2, esize[i]);
866a9fe1523SHonnappa Nagarahalli 		cur_src = src;
867a9fe1523SHonnappa Nagarahalli 
868a9fe1523SHonnappa Nagarahalli 		/* alloc some room for copied objects */
869a9fe1523SHonnappa Nagarahalli 		dst = test_ring_calloc(RING_SIZE * 2, esize[i]);
870a9fe1523SHonnappa Nagarahalli 		if (dst == NULL)
871a9fe1523SHonnappa Nagarahalli 			goto fail;
872a9fe1523SHonnappa Nagarahalli 		cur_dst = dst;
873a9fe1523SHonnappa Nagarahalli 
874a9fe1523SHonnappa Nagarahalli 		printf("Test enqueue without enough memory space\n");
875a9fe1523SHonnappa Nagarahalli 		for (j = 0; j < (RING_SIZE/MAX_BULK - 1); j++) {
8762d59e9c8SKonstantin Ananyev 			ret = test_ring_enq_impl(r, cur_src, esize[i], MAX_BULK,
8772d59e9c8SKonstantin Ananyev 							test_idx);
87846697431SFeifei Wang 			TEST_RING_VERIFY(ret == MAX_BULK, r, goto fail);
879a9fe1523SHonnappa Nagarahalli 			cur_src = test_ring_inc_ptr(cur_src, esize[i],
880a9fe1523SHonnappa Nagarahalli 								MAX_BULK);
881a9fe1523SHonnappa Nagarahalli 		}
882a9fe1523SHonnappa Nagarahalli 
883a9de470cSBruce Richardson 		printf("Enqueue 2 objects, free entries = MAX_BULK - 2\n");
8842d59e9c8SKonstantin Ananyev 		ret = test_ring_enq_impl(r, cur_src, esize[i], 2, test_idx);
88546697431SFeifei Wang 		TEST_RING_VERIFY(ret == 2, r, goto fail);
886a9fe1523SHonnappa Nagarahalli 		cur_src = test_ring_inc_ptr(cur_src, esize[i], 2);
887a9de470cSBruce Richardson 
888a9fe1523SHonnappa Nagarahalli 		printf("Enqueue the remaining entries = MAX_BULK - 3\n");
889a9fe1523SHonnappa Nagarahalli 		/* Bulk APIs enqueue exact number of elements */
890a9fe1523SHonnappa Nagarahalli 		if ((api_type & TEST_RING_ELEM_BULK) == TEST_RING_ELEM_BULK)
891a9fe1523SHonnappa Nagarahalli 			num_elems = MAX_BULK - 3;
892a9fe1523SHonnappa Nagarahalli 		else
893a9fe1523SHonnappa Nagarahalli 			num_elems = MAX_BULK;
894a9de470cSBruce Richardson 		/* Always one free entry left */
8952d59e9c8SKonstantin Ananyev 		ret = test_ring_enq_impl(r, cur_src, esize[i], num_elems,
8962d59e9c8SKonstantin Ananyev 						test_idx);
89746697431SFeifei Wang 		TEST_RING_VERIFY(ret == MAX_BULK - 3, r, goto fail);
898a9fe1523SHonnappa Nagarahalli 		cur_src = test_ring_inc_ptr(cur_src, esize[i], MAX_BULK - 3);
899a9de470cSBruce Richardson 
900a9de470cSBruce Richardson 		printf("Test if ring is full\n");
90146697431SFeifei Wang 		TEST_RING_VERIFY(rte_ring_full(r) == 1, r, goto fail);
902a9de470cSBruce Richardson 
903a9de470cSBruce Richardson 		printf("Test enqueue for a full entry\n");
9042d59e9c8SKonstantin Ananyev 		ret = test_ring_enq_impl(r, cur_src, esize[i], MAX_BULK,
9052d59e9c8SKonstantin Ananyev 						test_idx);
90646697431SFeifei Wang 		TEST_RING_VERIFY(ret == 0, r, goto fail);
907a9de470cSBruce Richardson 
908a9de470cSBruce Richardson 		printf("Test dequeue without enough objects\n");
909a9fe1523SHonnappa Nagarahalli 		for (j = 0; j < RING_SIZE / MAX_BULK - 1; j++) {
9102d59e9c8SKonstantin Ananyev 			ret = test_ring_deq_impl(r, cur_dst, esize[i], MAX_BULK,
9112d59e9c8SKonstantin Ananyev 							test_idx);
91246697431SFeifei Wang 			TEST_RING_VERIFY(ret == MAX_BULK, r, goto fail);
913a9fe1523SHonnappa Nagarahalli 			cur_dst = test_ring_inc_ptr(cur_dst, esize[i],
914a9fe1523SHonnappa Nagarahalli 								MAX_BULK);
915a9de470cSBruce Richardson 		}
916a9de470cSBruce Richardson 
917a9de470cSBruce Richardson 		/* Available memory space for the exact MAX_BULK entries */
9182d59e9c8SKonstantin Ananyev 		ret = test_ring_deq_impl(r, cur_dst, esize[i], 2, test_idx);
91946697431SFeifei Wang 		TEST_RING_VERIFY(ret == 2, r, goto fail);
920a9fe1523SHonnappa Nagarahalli 		cur_dst = test_ring_inc_ptr(cur_dst, esize[i], 2);
921a9de470cSBruce Richardson 
922a9fe1523SHonnappa Nagarahalli 		/* Bulk APIs enqueue exact number of elements */
923a9fe1523SHonnappa Nagarahalli 		if ((api_type & TEST_RING_ELEM_BULK) == TEST_RING_ELEM_BULK)
924a9fe1523SHonnappa Nagarahalli 			num_elems = MAX_BULK - 3;
925a9fe1523SHonnappa Nagarahalli 		else
926a9fe1523SHonnappa Nagarahalli 			num_elems = MAX_BULK;
9272d59e9c8SKonstantin Ananyev 		ret = test_ring_deq_impl(r, cur_dst, esize[i], num_elems,
9282d59e9c8SKonstantin Ananyev 						test_idx);
92946697431SFeifei Wang 		TEST_RING_VERIFY(ret == MAX_BULK - 3, r, goto fail);
930a9fe1523SHonnappa Nagarahalli 		cur_dst = test_ring_inc_ptr(cur_dst, esize[i], MAX_BULK - 3);
931a9de470cSBruce Richardson 
932a9de470cSBruce Richardson 		printf("Test if ring is empty\n");
933a9de470cSBruce Richardson 		/* Check if ring is empty */
93446697431SFeifei Wang 		TEST_RING_VERIFY(rte_ring_empty(r) == 1, r, goto fail);
935a9de470cSBruce Richardson 
936a9de470cSBruce Richardson 		/* check data */
93746697431SFeifei Wang 		TEST_RING_VERIFY(test_ring_mem_cmp(src, dst,
93846697431SFeifei Wang 					RTE_PTR_DIFF(cur_dst, dst)) == 0,
93946697431SFeifei Wang 					r, goto fail);
940a9de470cSBruce Richardson 
941a9de470cSBruce Richardson 		/* Free memory before test completed */
942a9fe1523SHonnappa Nagarahalli 		rte_ring_free(r);
943a9fe1523SHonnappa Nagarahalli 		rte_free(src);
944a9fe1523SHonnappa Nagarahalli 		rte_free(dst);
945a9fe1523SHonnappa Nagarahalli 		r = NULL;
946a9fe1523SHonnappa Nagarahalli 		src = NULL;
947a9fe1523SHonnappa Nagarahalli 		dst = NULL;
948a9fe1523SHonnappa Nagarahalli 	}
949a9de470cSBruce Richardson 
950a9fe1523SHonnappa Nagarahalli 	return 0;
951a9de470cSBruce Richardson fail:
952a9fe1523SHonnappa Nagarahalli 	rte_ring_free(r);
953a9fe1523SHonnappa Nagarahalli 	rte_free(src);
954a9fe1523SHonnappa Nagarahalli 	rte_free(dst);
955a9de470cSBruce Richardson 	return -1;
956a9de470cSBruce Richardson }
957a9de470cSBruce Richardson 
958a9de470cSBruce Richardson /*
959a9fe1523SHonnappa Nagarahalli  * Test default, single element, bulk and burst APIs
960a9de470cSBruce Richardson  */
961a9de470cSBruce Richardson static int
test_ring_basic_ex(void)962a9de470cSBruce Richardson test_ring_basic_ex(void)
963a9de470cSBruce Richardson {
964a9de470cSBruce Richardson 	int ret = -1;
965a9fe1523SHonnappa Nagarahalli 	unsigned int i, j;
966a9de470cSBruce Richardson 	struct rte_ring *rp = NULL;
967c570da36SFeifei Wang 	void **src = NULL, **cur_src = NULL, **dst = NULL, **cur_dst = NULL;
968a9de470cSBruce Richardson 
969a9fe1523SHonnappa Nagarahalli 	for (i = 0; i < RTE_DIM(esize); i++) {
970a9fe1523SHonnappa Nagarahalli 		rp = test_ring_create("test_ring_basic_ex", esize[i], RING_SIZE,
971a9fe1523SHonnappa Nagarahalli 					SOCKET_ID_ANY,
972a9de470cSBruce Richardson 					RING_F_SP_ENQ | RING_F_SC_DEQ);
973a9de470cSBruce Richardson 		if (rp == NULL) {
974a9fe1523SHonnappa Nagarahalli 			printf("%s: failed to create ring\n", __func__);
975a9de470cSBruce Richardson 			goto fail_test;
976a9de470cSBruce Richardson 		}
977a9de470cSBruce Richardson 
978c570da36SFeifei Wang 		/* alloc dummy object pointers */
979c570da36SFeifei Wang 		src = test_ring_calloc(RING_SIZE, esize[i]);
980c570da36SFeifei Wang 		if (src == NULL) {
981c570da36SFeifei Wang 			printf("%s: failed to alloc src memory\n", __func__);
982c570da36SFeifei Wang 			goto fail_test;
983c570da36SFeifei Wang 		}
984c570da36SFeifei Wang 		test_ring_mem_init(src, RING_SIZE, esize[i]);
985c570da36SFeifei Wang 		cur_src = src;
986c570da36SFeifei Wang 
987c570da36SFeifei Wang 		/* alloc some room for copied objects */
988c570da36SFeifei Wang 		dst = test_ring_calloc(RING_SIZE, esize[i]);
989c570da36SFeifei Wang 		if (dst == NULL) {
990c570da36SFeifei Wang 			printf("%s: failed to alloc dst memory\n", __func__);
991c570da36SFeifei Wang 			goto fail_test;
992c570da36SFeifei Wang 		}
993c570da36SFeifei Wang 		cur_dst = dst;
994c570da36SFeifei Wang 
99546697431SFeifei Wang 		TEST_RING_VERIFY(rte_ring_lookup("test_ring_basic_ex") == rp,
99646697431SFeifei Wang 					rp, goto fail_test);
997a9de470cSBruce Richardson 
99846697431SFeifei Wang 		TEST_RING_VERIFY(rte_ring_empty(rp) == 1, rp, goto fail_test);
999a9de470cSBruce Richardson 
1000a9fe1523SHonnappa Nagarahalli 		printf("%u ring entries are now free\n",
1001a9fe1523SHonnappa Nagarahalli 			rte_ring_free_count(rp));
1002a9de470cSBruce Richardson 
1003f642148eSFeifei Wang 		for (j = 0; j < RING_SIZE - 1; j++) {
1004f68c2066SFeifei Wang 			ret = test_ring_enqueue(rp, cur_src, esize[i], 1,
1005a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE);
100646697431SFeifei Wang 			TEST_RING_VERIFY(ret == 0, rp, goto fail_test);
1007c570da36SFeifei Wang 			cur_src = test_ring_inc_ptr(cur_src, esize[i], 1);
1008a9de470cSBruce Richardson 		}
1009a9de470cSBruce Richardson 
101046697431SFeifei Wang 		TEST_RING_VERIFY(rte_ring_full(rp) == 1, rp, goto fail_test);
1011a9de470cSBruce Richardson 
1012f642148eSFeifei Wang 		for (j = 0; j < RING_SIZE - 1; j++) {
1013f68c2066SFeifei Wang 			ret = test_ring_dequeue(rp, cur_dst, esize[i], 1,
1014a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE);
101546697431SFeifei Wang 			TEST_RING_VERIFY(ret == 0, rp, goto fail_test);
1016c570da36SFeifei Wang 			cur_dst = test_ring_inc_ptr(cur_dst, esize[i], 1);
1017a9de470cSBruce Richardson 		}
1018a9de470cSBruce Richardson 
101946697431SFeifei Wang 		TEST_RING_VERIFY(rte_ring_empty(rp) == 1, rp, goto fail_test);
1020a9de470cSBruce Richardson 
1021c570da36SFeifei Wang 		/* check data */
102246697431SFeifei Wang 		TEST_RING_VERIFY(test_ring_mem_cmp(src, dst,
102346697431SFeifei Wang 					RTE_PTR_DIFF(cur_dst, dst)) == 0,
102446697431SFeifei Wang 					rp, goto fail_test);
1025c570da36SFeifei Wang 
1026a9fe1523SHonnappa Nagarahalli 		/* Following tests use the configured flags to decide
1027a9fe1523SHonnappa Nagarahalli 		 * SP/SC or MP/MC.
1028a9fe1523SHonnappa Nagarahalli 		 */
1029c570da36SFeifei Wang 		/* reset memory of dst */
1030c570da36SFeifei Wang 		memset(dst, 0, RTE_PTR_DIFF(cur_dst, dst));
1031c570da36SFeifei Wang 
1032c570da36SFeifei Wang 		/* reset cur_src and cur_dst */
1033c570da36SFeifei Wang 		cur_src = src;
1034c570da36SFeifei Wang 		cur_dst = dst;
1035c570da36SFeifei Wang 
1036a9de470cSBruce Richardson 		/* Covering the ring burst operation */
1037c570da36SFeifei Wang 		ret = test_ring_enqueue(rp, cur_src, esize[i], 2,
1038a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST);
103946697431SFeifei Wang 		TEST_RING_VERIFY(ret == 2, rp, goto fail_test);
1040c570da36SFeifei Wang 		cur_src = test_ring_inc_ptr(cur_src, esize[i], 2);
1041a9de470cSBruce Richardson 
1042c570da36SFeifei Wang 		ret = test_ring_dequeue(rp, cur_dst, esize[i], 2,
1043a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST);
104446697431SFeifei Wang 		TEST_RING_VERIFY(ret == 2, rp, goto fail_test);
1045c570da36SFeifei Wang 		cur_dst = test_ring_inc_ptr(cur_dst, esize[i], 2);
1046a9de470cSBruce Richardson 
1047a9fe1523SHonnappa Nagarahalli 		/* Covering the ring bulk operation */
1048c570da36SFeifei Wang 		ret = test_ring_enqueue(rp, cur_src, esize[i], 2,
1049a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_BULK);
105046697431SFeifei Wang 		TEST_RING_VERIFY(ret == 2, rp, goto fail_test);
1051a9fe1523SHonnappa Nagarahalli 
1052c570da36SFeifei Wang 		ret = test_ring_dequeue(rp, cur_dst, esize[i], 2,
1053a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_BULK);
105446697431SFeifei Wang 		TEST_RING_VERIFY(ret == 2, rp, goto fail_test);
1055c570da36SFeifei Wang 		cur_dst = test_ring_inc_ptr(cur_dst, esize[i], 2);
1056c570da36SFeifei Wang 
1057c570da36SFeifei Wang 		/* check data */
105846697431SFeifei Wang 		TEST_RING_VERIFY(test_ring_mem_cmp(src, dst,
105946697431SFeifei Wang 					RTE_PTR_DIFF(cur_dst, dst)) == 0,
106046697431SFeifei Wang 					rp, goto fail_test);
1061a9fe1523SHonnappa Nagarahalli 
1062a9fe1523SHonnappa Nagarahalli 		rte_ring_free(rp);
1063c570da36SFeifei Wang 		rte_free(src);
1064c570da36SFeifei Wang 		rte_free(dst);
1065a9fe1523SHonnappa Nagarahalli 		rp = NULL;
1066c570da36SFeifei Wang 		src = NULL;
1067c570da36SFeifei Wang 		dst = NULL;
1068a9fe1523SHonnappa Nagarahalli 	}
1069a9fe1523SHonnappa Nagarahalli 
1070a9fe1523SHonnappa Nagarahalli 	return 0;
1071a9fe1523SHonnappa Nagarahalli 
1072a9de470cSBruce Richardson fail_test:
1073a9de470cSBruce Richardson 	rte_ring_free(rp);
1074c570da36SFeifei Wang 	rte_free(src);
1075c570da36SFeifei Wang 	rte_free(dst);
1076a9fe1523SHonnappa Nagarahalli 	return -1;
1077a9de470cSBruce Richardson }
1078a9de470cSBruce Richardson 
1079a9fe1523SHonnappa Nagarahalli /*
1080a9fe1523SHonnappa Nagarahalli  * Basic test cases with exact size ring.
1081a9fe1523SHonnappa Nagarahalli  */
1082a9de470cSBruce Richardson static int
test_ring_with_exact_size(void)1083a9de470cSBruce Richardson test_ring_with_exact_size(void)
1084a9de470cSBruce Richardson {
1085a9fe1523SHonnappa Nagarahalli 	struct rte_ring *std_r = NULL, *exact_sz_r = NULL;
1086c570da36SFeifei Wang 	void **src_orig = NULL, **dst_orig = NULL;
1087c570da36SFeifei Wang 	void **src = NULL, **cur_src = NULL, **dst = NULL, **cur_dst = NULL;
1088a9fe1523SHonnappa Nagarahalli 	const unsigned int ring_sz = 16;
1089a9fe1523SHonnappa Nagarahalli 	unsigned int i, j;
1090a9de470cSBruce Richardson 	int ret = -1;
1091a9de470cSBruce Richardson 
1092a9fe1523SHonnappa Nagarahalli 	for (i = 0; i < RTE_DIM(esize); i++) {
1093a9fe1523SHonnappa Nagarahalli 		test_ring_print_test_string("Test exact size ring",
1094a9fe1523SHonnappa Nagarahalli 				TEST_RING_IGNORE_API_TYPE,
1095a9fe1523SHonnappa Nagarahalli 				esize[i]);
1096a9fe1523SHonnappa Nagarahalli 
1097a9fe1523SHonnappa Nagarahalli 		std_r = test_ring_create("std", esize[i], ring_sz,
1098a9fe1523SHonnappa Nagarahalli 					rte_socket_id(),
1099a9de470cSBruce Richardson 					RING_F_SP_ENQ | RING_F_SC_DEQ);
1100a9fe1523SHonnappa Nagarahalli 		if (std_r == NULL) {
1101a9de470cSBruce Richardson 			printf("%s: error, can't create std ring\n", __func__);
1102a9fe1523SHonnappa Nagarahalli 			goto test_fail;
1103a9de470cSBruce Richardson 		}
1104a9fe1523SHonnappa Nagarahalli 		exact_sz_r = test_ring_create("exact sz", esize[i], ring_sz,
1105a9fe1523SHonnappa Nagarahalli 				rte_socket_id(),
1106a9fe1523SHonnappa Nagarahalli 				RING_F_SP_ENQ | RING_F_SC_DEQ |
1107a9fe1523SHonnappa Nagarahalli 				RING_F_EXACT_SZ);
1108a9fe1523SHonnappa Nagarahalli 		if (exact_sz_r == NULL) {
1109a9fe1523SHonnappa Nagarahalli 			printf("%s: error, can't create exact size ring\n",
1110a9fe1523SHonnappa Nagarahalli 					__func__);
1111a9fe1523SHonnappa Nagarahalli 			goto test_fail;
1112a9de470cSBruce Richardson 		}
1113a9de470cSBruce Richardson 
1114c570da36SFeifei Wang 		/* alloc object pointers. Allocate one extra object
1115c570da36SFeifei Wang 		 * and create an unaligned address.
1116c570da36SFeifei Wang 		 */
1117c570da36SFeifei Wang 		src_orig = test_ring_calloc(17, esize[i]);
1118c570da36SFeifei Wang 		if (src_orig == NULL)
1119c570da36SFeifei Wang 			goto test_fail;
1120c570da36SFeifei Wang 		test_ring_mem_init(src_orig, 17, esize[i]);
1121c570da36SFeifei Wang 		src = (void **)((uintptr_t)src_orig + 1);
1122c570da36SFeifei Wang 		cur_src = src;
1123c570da36SFeifei Wang 
1124c570da36SFeifei Wang 		dst_orig = test_ring_calloc(17, esize[i]);
1125c570da36SFeifei Wang 		if (dst_orig == NULL)
1126c570da36SFeifei Wang 			goto test_fail;
1127c570da36SFeifei Wang 		dst = (void **)((uintptr_t)dst_orig + 1);
1128c570da36SFeifei Wang 		cur_dst = dst;
1129c570da36SFeifei Wang 
1130a9de470cSBruce Richardson 		/*
1131a9fe1523SHonnappa Nagarahalli 		 * Check that the exact size ring is bigger than the
1132a9fe1523SHonnappa Nagarahalli 		 * standard ring
1133a9de470cSBruce Richardson 		 */
113446697431SFeifei Wang 		TEST_RING_VERIFY(rte_ring_get_size(std_r) <=
113546697431SFeifei Wang 				rte_ring_get_size(exact_sz_r),
113646697431SFeifei Wang 				std_r, goto test_fail);
113746697431SFeifei Wang 
1138a9de470cSBruce Richardson 		/*
1139a9fe1523SHonnappa Nagarahalli 		 * check that the exact_sz_ring can hold one more element
1140a9fe1523SHonnappa Nagarahalli 		 * than the standard ring. (16 vs 15 elements)
1141a9de470cSBruce Richardson 		 */
1142a9fe1523SHonnappa Nagarahalli 		for (j = 0; j < ring_sz - 1; j++) {
1143f68c2066SFeifei Wang 			ret = test_ring_enqueue(std_r, cur_src, esize[i], 1,
1144a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE);
114546697431SFeifei Wang 			TEST_RING_VERIFY(ret == 0, std_r, goto test_fail);
1146f68c2066SFeifei Wang 			ret = test_ring_enqueue(exact_sz_r, cur_src, esize[i], 1,
1147a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE);
114846697431SFeifei Wang 			TEST_RING_VERIFY(ret == 0, exact_sz_r, goto test_fail);
1149c570da36SFeifei Wang 			cur_src = test_ring_inc_ptr(cur_src, esize[i], 1);
1150a9de470cSBruce Richardson 		}
1151c570da36SFeifei Wang 		ret = test_ring_enqueue(std_r, cur_src, esize[i], 1,
1152a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE);
115346697431SFeifei Wang 		TEST_RING_VERIFY(ret == -ENOBUFS, std_r, goto test_fail);
1154c570da36SFeifei Wang 		ret = test_ring_enqueue(exact_sz_r, cur_src, esize[i], 1,
1155a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_SINGLE);
115646697431SFeifei Wang 		TEST_RING_VERIFY(ret != -ENOBUFS, exact_sz_r, goto test_fail);
1157a9de470cSBruce Richardson 
1158a9de470cSBruce Richardson 		/* check that dequeue returns the expected number of elements */
1159c570da36SFeifei Wang 		ret = test_ring_dequeue(exact_sz_r, cur_dst, esize[i], ring_sz,
1160a9fe1523SHonnappa Nagarahalli 				TEST_RING_THREAD_DEF | TEST_RING_ELEM_BURST);
116146697431SFeifei Wang 		TEST_RING_VERIFY(ret == (int)ring_sz, exact_sz_r, goto test_fail);
1162c570da36SFeifei Wang 		cur_dst = test_ring_inc_ptr(cur_dst, esize[i], ring_sz);
1163a9de470cSBruce Richardson 
1164a9de470cSBruce Richardson 		/* check that the capacity function returns expected value */
116546697431SFeifei Wang 		TEST_RING_VERIFY(rte_ring_get_capacity(exact_sz_r) == ring_sz,
116646697431SFeifei Wang 					exact_sz_r, goto test_fail);
1167a9de470cSBruce Richardson 
1168c570da36SFeifei Wang 		/* check data */
116946697431SFeifei Wang 		TEST_RING_VERIFY(test_ring_mem_cmp(src, dst,
117046697431SFeifei Wang 					RTE_PTR_DIFF(cur_dst, dst)) == 0,
117146697431SFeifei Wang 					exact_sz_r, goto test_fail);
1172c570da36SFeifei Wang 
1173c570da36SFeifei Wang 		rte_free(src_orig);
1174c570da36SFeifei Wang 		rte_free(dst_orig);
1175a9fe1523SHonnappa Nagarahalli 		rte_ring_free(std_r);
1176a9fe1523SHonnappa Nagarahalli 		rte_ring_free(exact_sz_r);
1177c570da36SFeifei Wang 		src_orig = NULL;
1178c570da36SFeifei Wang 		dst_orig = NULL;
1179a9fe1523SHonnappa Nagarahalli 		std_r = NULL;
1180a9fe1523SHonnappa Nagarahalli 		exact_sz_r = NULL;
1181a9fe1523SHonnappa Nagarahalli 	}
1182a9fe1523SHonnappa Nagarahalli 
1183a9fe1523SHonnappa Nagarahalli 	return 0;
1184a9fe1523SHonnappa Nagarahalli 
1185a9fe1523SHonnappa Nagarahalli test_fail:
1186c570da36SFeifei Wang 	rte_free(src_orig);
1187c570da36SFeifei Wang 	rte_free(dst_orig);
1188a9fe1523SHonnappa Nagarahalli 	rte_ring_free(std_r);
1189a9fe1523SHonnappa Nagarahalli 	rte_ring_free(exact_sz_r);
1190a9fe1523SHonnappa Nagarahalli 	return -1;
1191a9de470cSBruce Richardson }
1192a9de470cSBruce Richardson 
1193a9de470cSBruce Richardson static int
test_ring(void)1194a9de470cSBruce Richardson test_ring(void)
1195a9de470cSBruce Richardson {
11967c5e68cbSKonstantin Ananyev 	int32_t rc;
11972d59e9c8SKonstantin Ananyev 	unsigned int i;
1198a9de470cSBruce Richardson 
1199a9fe1523SHonnappa Nagarahalli 	/* Negative test cases */
1200a9fe1523SHonnappa Nagarahalli 	if (test_ring_negative_tests() < 0)
1201a9fe1523SHonnappa Nagarahalli 		goto test_fail;
1202a9fe1523SHonnappa Nagarahalli 
1203a9fe1523SHonnappa Nagarahalli 	/* Some basic operations */
1204a9de470cSBruce Richardson 	if (test_ring_basic_ex() < 0)
1205a9de470cSBruce Richardson 		goto test_fail;
1206a9de470cSBruce Richardson 
1207a9de470cSBruce Richardson 	if (test_ring_with_exact_size() < 0)
1208a9de470cSBruce Richardson 		goto test_fail;
1209a9de470cSBruce Richardson 
1210a9fe1523SHonnappa Nagarahalli 	/* Burst and bulk operations with sp/sc, mp/mc and default.
1211a9fe1523SHonnappa Nagarahalli 	 * The test cases are split into smaller test cases to
1212a9fe1523SHonnappa Nagarahalli 	 * help clang compile faster.
1213a9fe1523SHonnappa Nagarahalli 	 */
12142d59e9c8SKonstantin Ananyev 	for (i = 0; i != RTE_DIM(test_enqdeq_impl); i++) {
12157c5e68cbSKonstantin Ananyev 
1216a9fe1523SHonnappa Nagarahalli 
12172d59e9c8SKonstantin Ananyev 		rc = test_ring_burst_bulk_tests1(i);
12187c5e68cbSKonstantin Ananyev 		if (rc < 0)
12197c5e68cbSKonstantin Ananyev 			goto test_fail;
12207c5e68cbSKonstantin Ananyev 
12212d59e9c8SKonstantin Ananyev 		rc = test_ring_burst_bulk_tests2(i);
12227c5e68cbSKonstantin Ananyev 		if (rc < 0)
12237c5e68cbSKonstantin Ananyev 			goto test_fail;
12247c5e68cbSKonstantin Ananyev 
12252d59e9c8SKonstantin Ananyev 		rc = test_ring_burst_bulk_tests3(i);
12267c5e68cbSKonstantin Ananyev 		if (rc < 0)
12277c5e68cbSKonstantin Ananyev 			goto test_fail;
12287c5e68cbSKonstantin Ananyev 
12292d59e9c8SKonstantin Ananyev 		rc = test_ring_burst_bulk_tests4(i);
12307c5e68cbSKonstantin Ananyev 		if (rc < 0)
12317c5e68cbSKonstantin Ananyev 			goto test_fail;
12327c5e68cbSKonstantin Ananyev 	}
12337c5e68cbSKonstantin Ananyev 
1234a9de470cSBruce Richardson 	/* dump the ring status */
1235a9de470cSBruce Richardson 	rte_ring_list_dump(stdout);
1236a9de470cSBruce Richardson 
1237a9de470cSBruce Richardson 	return 0;
1238a9de470cSBruce Richardson 
1239a9de470cSBruce Richardson test_fail:
1240a9de470cSBruce Richardson 
1241a9de470cSBruce Richardson 	return -1;
1242a9de470cSBruce Richardson }
1243a9de470cSBruce Richardson 
1244*e0a8442cSBruce Richardson REGISTER_FAST_TEST(ring_autotest, true, true, test_ring);
1245