DPDK patches and discussions
 help / color / mirror / Atom feed
* [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).