From: Pavan Nikhilesh <pbhagavat...@marvell.com> Update event vector adapter test to depend on service core cycles instead of system cycles when waiting for events. Reorder event_type check to make sure event received is a vector before dereferencing vector structure.
Bugzilla ID: 1720 Fixes: de09387f1313 ("eventdev/vector: add default software vector adapter") Signed-off-by: Pavan Nikhilesh <pbhagavat...@marvell.com> --- app/test/test_event_vector_adapter.c | 111 +++++++++++++++++---------- 1 file changed, 70 insertions(+), 41 deletions(-) diff --git a/app/test/test_event_vector_adapter.c b/app/test/test_event_vector_adapter.c index 1441b0ff17bb..ae173c771589 100644 --- a/app/test/test_event_vector_adapter.c +++ b/app/test/test_event_vector_adapter.c @@ -10,7 +10,7 @@ #include "test.h" #ifdef RTE_EXEC_ENV_WINDOWS -static int __rte_unused +static int test_event_vector_adapter(void) { printf("event_vector_adapter not supported on Windows, skipping test\n"); @@ -39,12 +39,37 @@ static int adapter_slcore = -1; static uint8_t evdev; static bool using_services; static uint8_t vector_adptr_id; +static uint32_t vector_service_id = UINT32_MAX; +static uint32_t evdev_service_id = UINT32_MAX; +static uint64_t vector_tmo_us; static uint8_t evdev_max_queues; static struct rte_mempool *vector_mp; static uint64_t objs[MAX_VECTOR_SIZE] = {0xDEADBEAF, 0xDEADBEEF, 0xDEADC0DE, 0xDEADCAFE, 0xDEADFACE, 0xDEADFADE, 0xDEADFAAA, 0xDEADFAAB}; +static void +wait_service_us(uint32_t service_id, uint64_t us) +{ +#define USEC2TICK(__us, __freq) (((__us) * (__freq)) / 1E6) + uint64_t service_cycles; + uint64_t cycles = USEC2TICK(us, rte_get_timer_hz()); + + if (service_id == UINT32_MAX) { + rte_delay_us(us); + return; + } + + rte_service_attr_reset_all(service_id); + do { + service_cycles = 0; + if (vector_service_id != UINT32_MAX) + rte_service_attr_get(vector_service_id, RTE_SERVICE_ATTR_CYCLES, + &service_cycles); + rte_delay_us(us); + } while ((vector_service_id != UINT32_MAX && service_cycles < cycles)); +} + static int test_event_vector_adapter_create_multi(void) { @@ -121,7 +146,7 @@ test_event_vector_adapter_create(void) conf.event_dev_id = evdev; conf.socket_id = rte_socket_id(); conf.vector_sz = RTE_MIN(MAX_VECTOR_SIZE, info.max_vector_sz); - conf.vector_timeout_ns = info.max_vector_timeout_ns; + conf.vector_timeout_ns = RTE_MIN(1E6, info.max_vector_timeout_ns); conf.vector_mp = vector_mp; conf.ev.queue_id = 0; @@ -150,7 +175,12 @@ test_event_vector_adapter_create(void) "Failed to map adapter service"); TEST_ASSERT(rte_service_runstate_set(service_id, 1) == 0, "Failed to start adapter service"); + rte_service_set_stats_enable(service_id, 1); + vector_service_id = service_id; } + + vector_tmo_us = (conf.vector_timeout_ns / 1E3) * 2; + return TEST_SUCCESS; } @@ -171,6 +201,7 @@ test_event_vector_adapter_free(void) rte_service_lcore_del(adapter_slcore); } adapter_slcore = -1; + vector_service_id = UINT32_MAX; } rte_event_vector_adapter_destroy(adapter); } @@ -191,21 +222,22 @@ test_event_vector_adapter_enqueue(void) ret = rte_event_vector_adapter_enqueue(adapter, objs, MAX_VECTOR_SIZE, 0); TEST_ASSERT((ret == MAX_VECTOR_SIZE), "Failed to enqueue event vector %d", ret); + wait_service_us(vector_service_id, 1E2); for (i = 0; i < MAX_RETRIES; i++) { ret = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0); if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); + TEST_ASSERT((ev.event_type == (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)), + "Invalid event type %d", ev.event_type); TEST_ASSERT((ev.vec->nb_elem == MAX_VECTOR_SIZE), "Incomplete event vector %d", ev.vec->nb_elem); TEST_ASSERT((ev.queue_id == 0), "Invalid event type %d", ev.queue_id); - TEST_ASSERT((ev.event_type == (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)), - "Invalid event type %d", ev.event_type); TEST_ASSERT((ev.sched_type == RTE_SCHED_TYPE_PARALLEL), "Invalid sched type %d", ev.sched_type); @@ -219,38 +251,33 @@ test_event_vector_adapter_enqueue(void) static int test_event_vector_adapter_enqueue_tmo(void) { - struct rte_event_vector_adapter_info info; struct rte_event_vector_adapter *adapter; uint16_t vec_sz = MAX_VECTOR_SIZE - 4; struct rte_event ev; int ret, i; - memset(&info, 0, sizeof(info)); - ret = rte_event_vector_adapter_info_get(evdev, &info); - TEST_ASSERT_SUCCESS(ret, "Failed to get event vector adapter info"); - adapter = rte_event_vector_adapter_lookup(vector_adptr_id); TEST_ASSERT(adapter != NULL, "Failed to lookup event vector adapter"); ret = rte_event_vector_adapter_enqueue(adapter, objs, vec_sz, 0); TEST_ASSERT((ret == vec_sz), "Failed to enqueue event vector %d", ret); - rte_delay_us(info.max_vector_timeout_ns / 1000); + wait_service_us(vector_service_id, vector_tmo_us); for (i = 0; i < MAX_RETRIES; i++) { ret = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0); if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); + TEST_ASSERT((ev.event_type == (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)), + "Invalid event type %d", ev.event_type); TEST_ASSERT((ev.vec->nb_elem == vec_sz), "Incomplete event vector %d", ev.vec->nb_elem); TEST_ASSERT((ev.queue_id == 0), "Invalid event type %d", ev.queue_id); - TEST_ASSERT((ev.event_type == (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)), - "Invalid event type %d", ev.event_type); TEST_ASSERT((ev.sched_type == RTE_SCHED_TYPE_PARALLEL), "Invalid sched type %d", ev.sched_type); @@ -278,12 +305,13 @@ test_event_vector_adapter_enqueue_fallback(void) ret = rte_event_vector_adapter_enqueue(adapter, objs, 1, 0); TEST_ASSERT((ret == 1), "Failed to enqueue event vector %d", ret); + wait_service_us(vector_service_id, vector_tmo_us); for (i = 0; i < MAX_RETRIES; i++) { ret = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0); if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); @@ -300,17 +328,12 @@ test_event_vector_adapter_enqueue_fallback(void) static int test_event_vector_adapter_enqueue_sov(void) { - struct rte_event_vector_adapter_info info; struct rte_event_vector_adapter *adapter; uint16_t vec_sz = MAX_VECTOR_SIZE - 4; struct rte_event ev; uint32_t caps; int ret, i; - memset(&info, 0, sizeof(info)); - ret = rte_event_vector_adapter_info_get(evdev, &info); - TEST_ASSERT_SUCCESS(ret, "Failed to get event vector adapter info"); - caps = 0; ret = rte_event_vector_adapter_caps_get(evdev, &caps); TEST_ASSERT_SUCCESS(ret, "Failed to get event vector adapter caps"); @@ -329,30 +352,34 @@ test_event_vector_adapter_enqueue_sov(void) ret = rte_event_vector_adapter_enqueue(adapter, &objs[vec_sz], 2, RTE_EVENT_VECTOR_ENQ_SOV); TEST_ASSERT((ret == 2), "Failed to enqueue event vector %d", ret); + wait_service_us(vector_service_id, vector_tmo_us); for (i = 0; i < MAX_RETRIES; i++) { ret = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0); if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } + TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); + TEST_ASSERT((ev.event_type == (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)), + "Invalid event type %d", ev.event_type); + TEST_ASSERT((ev.vec->nb_elem == vec_sz), "Incorrect event vector %d", ev.vec->nb_elem); + for (i = 0; i < vec_sz; i++) TEST_ASSERT((ev.vec->u64s[i] == objs[i]), "Invalid object in event vector %" PRIx64, ev.vec->u64s[i]); - TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); - TEST_ASSERT((ev.vec->nb_elem == vec_sz), "Incorrect event vector %d", ev.vec->nb_elem); - - rte_delay_us(info.max_vector_timeout_ns / 1000); for (i = 0; i < MAX_RETRIES; i++) { ret = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0); if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); + TEST_ASSERT((ev.event_type == (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)), + "Invalid event type %d", ev.event_type); TEST_ASSERT((ev.vec->nb_elem == 2), "Incorrect event vector %d", ev.vec->nb_elem); for (i = 0; i < 2; i++) @@ -365,17 +392,12 @@ test_event_vector_adapter_enqueue_sov(void) static int test_event_vector_adapter_enqueue_eov(void) { - struct rte_event_vector_adapter_info info; struct rte_event_vector_adapter *adapter; uint16_t vec_sz = MAX_VECTOR_SIZE - 4; struct rte_event ev; uint32_t caps; int ret, i; - memset(&info, 0, sizeof(info)); - ret = rte_event_vector_adapter_info_get(evdev, &info); - TEST_ASSERT_SUCCESS(ret, "Failed to get event vector adapter info"); - caps = 0; ret = rte_event_vector_adapter_caps_get(evdev, &caps); TEST_ASSERT_SUCCESS(ret, "Failed to get event vector adapter caps"); @@ -399,10 +421,12 @@ test_event_vector_adapter_enqueue_eov(void) if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); + TEST_ASSERT((ev.event_type == (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)), + "Invalid event type %d", ev.event_type); TEST_ASSERT((ev.vec->nb_elem == vec_sz + 1), "Incorrect event vector %d", ev.vec->nb_elem); ret = rte_event_vector_adapter_enqueue(adapter, objs, MAX_VECTOR_SIZE - 1, 0); @@ -417,10 +441,12 @@ test_event_vector_adapter_enqueue_eov(void) if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); + TEST_ASSERT((ev.event_type == (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)), + "Invalid event type %d", ev.event_type); TEST_ASSERT((ev.vec->nb_elem == MAX_VECTOR_SIZE), "Incorrect event vector %d", ev.vec->nb_elem); @@ -431,14 +457,17 @@ test_event_vector_adapter_enqueue_eov(void) TEST_ASSERT((ev.vec->u64s[MAX_VECTOR_SIZE - 1] == objs[vec_sz]), "Invalid object in event vector %" PRIx64, ev.vec->u64s[MAX_VECTOR_SIZE - 1]); + wait_service_us(vector_service_id, vector_tmo_us); for (i = 0; i < MAX_RETRIES; i++) { ret = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0); if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); + TEST_ASSERT((ev.event_type == (RTE_EVENT_TYPE_VECTOR | RTE_EVENT_TYPE_CPU)), + "Invalid event type %d", ev.event_type); TEST_ASSERT((ev.vec->nb_elem == vec_sz - 1), "Incorrect event vector %d", ev.vec->nb_elem); for (i = 0; i < vec_sz - 1; i++) @@ -483,7 +512,7 @@ test_event_vector_adapter_enqueue_sov_eov(void) if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); @@ -504,7 +533,7 @@ test_event_vector_adapter_enqueue_sov_eov(void) if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); if (info.min_vector_sz > 1) @@ -538,7 +567,7 @@ test_event_vector_adapter_enqueue_flush(void) if (ret) break; - rte_delay_ms(1); + wait_service_us(evdev_service_id, 1E2); } TEST_ASSERT((ret == 1), "Failed to dequeue event vector %d", ret); @@ -598,6 +627,8 @@ eventdev_setup(void) "Failed to map evdev service"); TEST_ASSERT_SUCCESS(rte_service_runstate_set(service_id, 1), "Failed to start evdev service"); + rte_service_set_stats_enable(service_id, 1); + evdev_service_id = service_id; } ret = rte_event_dev_start(evdev); @@ -669,7 +700,7 @@ static struct unit_test_suite functional_testsuite = { } }; -static int __rte_unused +static int test_event_vector_adapter(void) { return unit_test_suite_runner(&functional_testsuite); @@ -677,6 +708,4 @@ test_event_vector_adapter(void) #endif -/* disabled because of reported failures, waiting for a fix - * REGISTER_FAST_TEST(event_vector_adapter_autotest, true, true, test_event_vector_adapter); - */ +REGISTER_FAST_TEST(event_vector_adapter_autotest, true, true, test_event_vector_adapter); -- 2.39.5 (Apple Git-154)