When a configured worker lcore is same as EAL main lcore, the main
thread calls `rte_eal_remote_launch()` on itself and then waits for
`worker_info.ready_flag`. The worker function cannot run on the main
lcore while the main thread is blocked in that loop, and the test hangs.

Reject such cases early in the `run_test()`.

Fixes: 623dc9364dc6 ("app/dma-perf: introduce DMA performance test")
CC: [email protected]

Signed-off-by: Rupesh Chiluka <[email protected]>
---
 app/test-dma-perf/main.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/app/test-dma-perf/main.c b/app/test-dma-perf/main.c
index 4249dcfd3d..a22434c558 100644
--- a/app/test-dma-perf/main.c
+++ b/app/test-dma-perf/main.c
@@ -109,7 +109,9 @@ run_test_case(struct test_configure *case_cfg)
 static void
 run_test(uint32_t case_id, struct test_configure *case_cfg)
 {
+       uint32_t worker_lcore;
        uint32_t nb_lcores = rte_lcore_count();
+       uint32_t main_lcore = rte_get_main_lcore();
        struct test_configure_entry *mem_size = &case_cfg->mem_size;
        struct test_configure_entry *buf_size = &case_cfg->buf_size;
        struct test_configure_entry *ring_size = &case_cfg->ring_size;
@@ -122,6 +124,15 @@ run_test(uint32_t case_id, struct test_configure *case_cfg)
                return;
        }
 
+       for (uint32_t i = 0; i < case_cfg->num_worker; i++) {
+               worker_lcore = case_cfg->dma_config[i].lcore_dma_map.lcore;
+               if (worker_lcore == main_lcore) {
+                       printf("Case %u: worker %u (lcore %u) cannot run on the 
EAL main lcore (%u).\n",
+                              case_id, i, worker_lcore, main_lcore);
+                       return;
+               }
+       }
+
        printf("Number of used lcores: %u.\n", nb_lcores);
 
        if (mem_size->incr != 0)
-- 
2.48.1

Reply via email to