When RX socket setup fails during the first traffic step, the RX worker previously reports test->fail only after waiting at the setup barrier. The main thread can then start TX setup before it observes that failure. For shared-UMEM tests, TX setup depends on the RX-side socket and UMEM state having been configured successfully. Do not start TX setup after a failed RX setup. Set test->fail before the RX worker reaches the barrier and check it before starting the TX thread. The existing post-join teardown cleans up the RX socket slots and UMEM. Signed-off-by: Magnus Karlsson Signed-off-by: Tushar Vyavahare --- tools/testing/selftests/bpf/prog_tests/test_xsk.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/test_xsk.c b/tools/testing/selftests/bpf/prog_tests/test_xsk.c index a3c77ab5f05c..6d3b2ecc957b 100644 --- a/tools/testing/selftests/bpf/prog_tests/test_xsk.c +++ b/tools/testing/selftests/bpf/prog_tests/test_xsk.c @@ -1703,12 +1703,15 @@ void *worker_testapp_validate_rx(void *arg) strerror(-err)); } + /* Publish setup failure before releasing the main thread from the barrier. */ + if (err) + test->fail = true; + if (test->use_barrier) pthread_barrier_wait(&barr); /* We leave only now in case of error to avoid getting stuck in the barrier */ if (err) { - test->fail = true; pthread_exit(NULL); } @@ -1907,7 +1910,7 @@ static int __testapp_validate_traffic(struct test_spec *test, struct ifobject *i } } - if (ifobj2) { + if (ifobj2 && !test->fail) { /*Spawn TX thread */ pthread_create(&t1, NULL, ifobj2->func_ptr, test); pthread_join(t1, NULL); -- 2.43.0