* [PATCH] test/event: fix event vector adapter timeouts
@ 2025-06-12 0:13 pbhagavatula
2025-06-19 10:56 ` Pavan Nikhilesh Bhagavatula
0 siblings, 1 reply; 2+ messages in thread
From: pbhagavatula @ 2025-06-12 0:13 UTC (permalink / raw)
To: jerinj, thomas, david.marchand, Pavan Nikhilesh; +Cc: dev
From: Pavan Nikhilesh <pbhagavatula@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 <pbhagavatula@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)
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] test/event: fix event vector adapter timeouts
2025-06-12 0:13 [PATCH] test/event: fix event vector adapter timeouts pbhagavatula
@ 2025-06-19 10:56 ` Pavan Nikhilesh Bhagavatula
0 siblings, 0 replies; 2+ messages in thread
From: Pavan Nikhilesh Bhagavatula @ 2025-06-19 10:56 UTC (permalink / raw)
To: Jerin Jacob, thomas, david.marchand; +Cc: dev
>Sent: Thursday, June 12, 2025 05:43
>To: Jerin Jacob; thomas@monjalon.net; david.marchand@redhat.com; Pavan Nikhilesh Bhagavatula
>Cc: dev@dpdk.org
>Subject: [PATCH] test/event: fix event vector adapter timeouts
>
>From: Pavan Nikhilesh <pbhagavatula@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")
Recheck-request: rebase=main, iol-unit-amd64-testing
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-06-19 10:56 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-06-12 0:13 [PATCH] test/event: fix event vector adapter timeouts pbhagavatula
2025-06-19 10:56 ` Pavan Nikhilesh Bhagavatula
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).