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