From: Jun Yang <[email protected]>

The DPAA2 eventdev selftest helper generate_random_events() used to
hard-code port 0 both as the only port linked to all queues and as the
source port for every enqueued event. That worked for the single-port
tests but made it impossible to exercise the multi-port dequeue path
correctly: test_multi_queue_enq_multi_port_deq() was enqueuing all
events from port 0 while expecting workers on every port to drain them,
which does not match how real multi-port setups are configured.

Rework the helper and its callers so that ordering/port fan-out is
driven by the test, not baked into the generator:

 - generate_random_events() now takes an array of port ids and a port
   count. It links the full queue set to each of those ports and
   round-robins the source port of generated events across them
   (rte_rand() % nr_ports) instead of always using port 0.

 - test_multi_queue_enq_single_port_deq() and test_dev_stop_flush()
   pass a single-element {0} array, preserving their previous behavior.

 - test_multi_queue_enq_multi_port_deq() queries the device port count
   (capped at MAX_PORTS), builds the port id array, and only then
   generates events, so events are actually spread across all ports
   that workers will dequeue from.

Also split the teardown for test_dev_stop_flush: because the stop-flush
callback already frees mbufs back to the pool, calling the standard
eventdev_teardown() (which does extra cleanup assuming a live mempool
state) was fragile. Introduce eventdev_stop_flush_teardown() that only
frees the mempool, and wire it into the DPAA2_TEST_RUN entry for
test_dev_stop_flush.

No functional change for the single-port tests; the multi-port test
now actually tests multi-port enqueue + multi-port dequeue.

Signed-off-by: Jun Yang <[email protected]>
---
 drivers/event/dpaa2/dpaa2_eventdev_selftest.c | 44 ++++++++++++-------
 1 file changed, 29 insertions(+), 15 deletions(-)

diff --git a/drivers/event/dpaa2/dpaa2_eventdev_selftest.c 
b/drivers/event/dpaa2/dpaa2_eventdev_selftest.c
index 569621dc39..6162932a5c 100644
--- a/drivers/event/dpaa2/dpaa2_eventdev_selftest.c
+++ b/drivers/event/dpaa2/dpaa2_eventdev_selftest.c
@@ -227,6 +227,12 @@ eventdev_teardown(void)
        rte_mempool_free(eventdev_test_mempool);
 }
 
+static void
+eventdev_stop_flush_teardown(void)
+{
+       rte_mempool_free(eventdev_test_mempool);
+}
+
 static void
 update_event_and_validation_attr(struct rte_mbuf *m, struct rte_event *ev,
        uint32_t flow_id, uint8_t event_type,
@@ -305,7 +311,8 @@ check_excess_events(uint8_t port)
 }
 
 static int
-generate_random_events(const unsigned int total_events)
+generate_random_events(const uint32_t total_events,
+       uint8_t port_ids[], uint32_t nr_ports)
 {
        struct rte_event_dev_info info;
        uint32_t queue_count, i;
@@ -320,10 +327,11 @@ generate_random_events(const unsigned int total_events)
        for (i = 0; i < queue_count; i++)
                queues[i] = i;
 
-       ret = rte_event_port_link(evdev, 0, queues, NULL,
-                       queue_count);
-       RTE_TEST_ASSERT(ret >= 0, "Failed to link %d queues port0",
-               queue_count);
+       for (i = 0; i < nr_ports; i++) {
+               ret = rte_event_port_link(evdev, port_ids[i], queues, NULL, 
queue_count);
+               RTE_TEST_ASSERT(ret >= 0, "Failed to link %d queues port.%d",
+                       queue_count, port_ids[i]);
+       }
 
        ret = rte_event_dev_info_get(evdev, &info);
        RTE_TEST_ASSERT_SUCCESS(ret, "Failed to get event dev info");
@@ -333,7 +341,7 @@ generate_random_events(const unsigned int total_events)
                        rte_rand() % 256 /* sub_event_type */,
                        rte_rand() % (RTE_SCHED_TYPE_PARALLEL + 1),
                        rte_rand() % queue_count,
-                       0 /* port */,
+                       rte_rand() % nr_ports,
                        1 /* events */);
                if (ret)
                        return ret;
@@ -341,7 +349,6 @@ generate_random_events(const unsigned int total_events)
        return ret;
 }
 
-
 static int
 validate_event(struct rte_event *ev)
 {
@@ -475,8 +482,9 @@ test_multi_queue_enq_single_port_deq(void)
 {
        int ret;
        uint32_t dq_events;
+       uint8_t port_id = 0;
 
-       ret = generate_random_events(MAX_EVENTS);
+       ret = generate_random_events(MAX_EVENTS, &port_id, 1);
        if (ret)
                return ret;
 
@@ -608,13 +616,10 @@ static int
 test_multi_queue_enq_multi_port_deq(void)
 {
        const unsigned int total_events = MAX_EVENTS;
-       uint32_t nr_ports;
+       uint32_t nr_ports, i;
+       uint8_t port_ids[MAX_PORTS];
        int ret;
 
-       ret = generate_random_events(total_events);
-       if (ret)
-               return ret;
-
        RTE_TEST_ASSERT_SUCCESS(rte_event_dev_attr_get(evdev,
                RTE_EVENT_DEV_ATTR_PORT_COUNT, &nr_ports),
                "Port count get failed");
@@ -625,6 +630,14 @@ test_multi_queue_enq_multi_port_deq(void)
                        __func__, nr_ports, rte_lcore_count() - 1);
                return -EINVAL;
        }
+       if (nr_ports > MAX_PORTS)
+               nr_ports = MAX_PORTS;
+
+       for (i = 0; i < nr_ports; i++)
+               port_ids[i] = i;
+       ret = generate_random_events(total_events, port_ids, nr_ports);
+       if (ret)
+               return ret;
 
        return launch_workers_and_wait(worker_multi_port_fn,
                                worker_multi_port_fn, total_events,
@@ -646,8 +659,9 @@ test_dev_stop_flush(void)
 {
        unsigned int total_events = MAX_EVENTS, count = 0;
        int ret;
+       uint8_t port_id = 0;
 
-       ret = generate_random_events(total_events);
+       ret = generate_random_events(total_events, &port_id, 1);
        if (ret)
                return -1;
 
@@ -861,7 +875,7 @@ test_eventdev_dpaa2(void)
                        test_simple_enqdeq_parallel);
        DPAA2_TEST_RUN(eventdev_setup, eventdev_teardown,
                        test_multi_queue_enq_single_port_deq);
-       DPAA2_TEST_RUN(eventdev_setup, eventdev_teardown,
+       DPAA2_TEST_RUN(eventdev_setup, eventdev_stop_flush_teardown,
                        test_dev_stop_flush);
        DPAA2_TEST_RUN(eventdev_atomic_port_setup, eventdev_teardown,
                        test_multi_queue_enq_multi_port_deq);
-- 
2.43.0

Reply via email to