From f72299fd157deee129c5d8415f9a58b1af0bf84c Mon Sep 17 00:00:00 2001 From: Honnappa Nagarahalli Date: Sun, 25 Oct 2020 00:45:52 -0500 Subject: [PATCH] test/ring: add stress tests for zero copy API Add stress tests for zero copy API. Signed-off-by: Honnappa Nagarahalli Reviewed-by: Dharmik Thakkar Acked-by: Konstantin Ananyev --- app/test/meson.build | 2 + app/test/test_ring_mt_peek_stress_zc.c | 56 +++++++++++++++++++++++ app/test/test_ring_st_peek_stress_zc.c | 63 ++++++++++++++++++++++++++ app/test/test_ring_stress.c | 6 +++ app/test/test_ring_stress.h | 2 + 5 files changed, 129 insertions(+) create mode 100644 app/test/test_ring_mt_peek_stress_zc.c create mode 100644 app/test/test_ring_st_peek_stress_zc.c diff --git a/app/test/meson.build b/app/test/meson.build index 8bfb028903..88c831a92e 100644 --- a/app/test/meson.build +++ b/app/test/meson.build @@ -108,9 +108,11 @@ test_sources = files('commands.c', 'test_ring_mpmc_stress.c', 'test_ring_hts_stress.c', 'test_ring_mt_peek_stress.c', + 'test_ring_mt_peek_stress_zc.c', 'test_ring_perf.c', 'test_ring_rts_stress.c', 'test_ring_st_peek_stress.c', + 'test_ring_st_peek_stress_zc.c', 'test_ring_stress.c', 'test_rwlock.c', 'test_sched.c', diff --git a/app/test/test_ring_mt_peek_stress_zc.c b/app/test/test_ring_mt_peek_stress_zc.c new file mode 100644 index 0000000000..7e0bd511a7 --- /dev/null +++ b/app/test/test_ring_mt_peek_stress_zc.c @@ -0,0 +1,56 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2020 Arm Limited + */ + +#include "test_ring.h" +#include "test_ring_stress_impl.h" +#include + +static inline uint32_t +_st_ring_dequeue_bulk(struct rte_ring *r, void **obj, uint32_t n, + uint32_t *avail) +{ + uint32_t m; + struct rte_ring_zc_data zcd; + + m = rte_ring_dequeue_zc_bulk_start(r, n, &zcd, avail); + n = (m == n) ? n : 0; + if (n != 0) { + /* Copy the data from the ring */ + test_ring_copy_from(&zcd, obj, -1, n); + rte_ring_dequeue_zc_finish(r, n); + } + + return n; +} + +static inline uint32_t +_st_ring_enqueue_bulk(struct rte_ring *r, void * const *obj, uint32_t n, + uint32_t *free) +{ + uint32_t m; + struct rte_ring_zc_data zcd; + + m = rte_ring_enqueue_zc_bulk_start(r, n, &zcd, free); + n = (m == n) ? n : 0; + if (n != 0) { + /* Copy the data from the ring */ + test_ring_copy_to(&zcd, obj, -1, n); + rte_ring_enqueue_zc_finish(r, n); + } + + return n; +} + +static int +_st_ring_init(struct rte_ring *r, const char *name, uint32_t num) +{ + return rte_ring_init(r, name, num, + RING_F_MP_HTS_ENQ | RING_F_MC_HTS_DEQ); +} + +const struct test test_ring_mt_peek_stress_zc = { + .name = "MT_PEEK_ZC", + .nb_case = RTE_DIM(tests), + .cases = tests, +}; diff --git a/app/test/test_ring_st_peek_stress_zc.c b/app/test/test_ring_st_peek_stress_zc.c new file mode 100644 index 0000000000..b9dbd4a6f6 --- /dev/null +++ b/app/test/test_ring_st_peek_stress_zc.c @@ -0,0 +1,63 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2020 Arm Limited + */ + +#include "test_ring.h" +#include "test_ring_stress_impl.h" +#include + +static inline uint32_t +_st_ring_dequeue_bulk(struct rte_ring *r, void **obj, uint32_t n, + uint32_t *avail) +{ + uint32_t m; + struct rte_ring_zc_data zcd; + + static rte_spinlock_t lck = RTE_SPINLOCK_INITIALIZER; + + rte_spinlock_lock(&lck); + + m = rte_ring_dequeue_zc_bulk_start(r, n, &zcd, avail); + if (m != 0) { + /* Copy the data from the ring */ + test_ring_copy_from(&zcd, obj, -1, m); + rte_ring_dequeue_zc_finish(r, m); + } + + rte_spinlock_unlock(&lck); + return m; +} + +static inline uint32_t +_st_ring_enqueue_bulk(struct rte_ring *r, void * const *obj, uint32_t n, + uint32_t *free) +{ + uint32_t m; + struct rte_ring_zc_data zcd; + + static rte_spinlock_t lck = RTE_SPINLOCK_INITIALIZER; + + rte_spinlock_lock(&lck); + + m = rte_ring_enqueue_zc_bulk_start(r, n, &zcd, free); + if (m != 0) { + /* Copy the data from the ring */ + test_ring_copy_to(&zcd, obj, -1, m); + rte_ring_enqueue_zc_finish(r, m); + } + + rte_spinlock_unlock(&lck); + return m; +} + +static int +_st_ring_init(struct rte_ring *r, const char *name, uint32_t num) +{ + return rte_ring_init(r, name, num, RING_F_SP_ENQ | RING_F_SC_DEQ); +} + +const struct test test_ring_st_peek_stress_zc = { + .name = "ST_PEEK_ZC", + .nb_case = RTE_DIM(tests), + .cases = tests, +}; diff --git a/app/test/test_ring_stress.c b/app/test/test_ring_stress.c index c4f82ea567..1af45e0fc8 100644 --- a/app/test/test_ring_stress.c +++ b/app/test/test_ring_stress.c @@ -49,9 +49,15 @@ test_ring_stress(void) n += test_ring_mt_peek_stress.nb_case; k += run_test(&test_ring_mt_peek_stress); + n += test_ring_mt_peek_stress_zc.nb_case; + k += run_test(&test_ring_mt_peek_stress_zc); + n += test_ring_st_peek_stress.nb_case; k += run_test(&test_ring_st_peek_stress); + n += test_ring_st_peek_stress_zc.nb_case; + k += run_test(&test_ring_st_peek_stress_zc); + printf("Number of tests:\t%u\nSuccess:\t%u\nFailed:\t%u\n", n, k, n - k); return (k != n); diff --git a/app/test/test_ring_stress.h b/app/test/test_ring_stress.h index c85d6fa92e..416d68c9a0 100644 --- a/app/test/test_ring_stress.h +++ b/app/test/test_ring_stress.h @@ -36,4 +36,6 @@ extern const struct test test_ring_mpmc_stress; extern const struct test test_ring_rts_stress; extern const struct test test_ring_hts_stress; extern const struct test test_ring_mt_peek_stress; +extern const struct test test_ring_mt_peek_stress_zc; extern const struct test test_ring_st_peek_stress; +extern const struct test test_ring_st_peek_stress_zc; -- 2.20.1