[PATCH bpf-next v6 12/15] selftests/bpf: test_xsk: Don't exit immediately if validate_traffic fails

Bastien Curutchet (eBPF Foundation) posted 15 patches 3 months, 1 week ago
There is a newer version of this series
[PATCH bpf-next v6 12/15] selftests/bpf: test_xsk: Don't exit immediately if validate_traffic fails
Posted by Bastien Curutchet (eBPF Foundation) 3 months, 1 week ago
__testapp_validate_traffic() calls exit_with_error() on failures. This
exits the program immediately. It prevents the following tests from
running and isn't compliant with the CI.

Return TEST_FAILURE instead of calling exit_with_error().
Release the resource of the 1st thread if a failure happens between its
creation and the creation of the second thread.

Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: Bastien Curutchet (eBPF Foundation) <bastien.curutchet@bootlin.com>
---
 tools/testing/selftests/bpf/test_xsk.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/bpf/test_xsk.c b/tools/testing/selftests/bpf/test_xsk.c
index 2c392d5b9f30145cf7b0ea8a49990f1673bef6c9..18a6ce648461de1975aa25997a22c77cecb97a76 100644
--- a/tools/testing/selftests/bpf/test_xsk.c
+++ b/tools/testing/selftests/bpf/test_xsk.c
@@ -1772,12 +1772,12 @@ static int __testapp_validate_traffic(struct test_spec *test, struct ifobject *i
 	err = test_spec_set_mtu(test, test->mtu);
 	if (err) {
 		ksft_print_msg("Error, could not set mtu.\n");
-		exit_with_error(err);
+		return TEST_FAILURE;
 	}
 
 	if (ifobj2) {
 		if (pthread_barrier_init(&barr, NULL, 2))
-			exit_with_error(errno);
+			return TEST_FAILURE;
 		pkt_stream_reset(ifobj2->xsk->pkt_stream);
 	}
 
@@ -1791,8 +1791,11 @@ static int __testapp_validate_traffic(struct test_spec *test, struct ifobject *i
 
 	if (ifobj2) {
 		pthread_barrier_wait(&barr);
-		if (pthread_barrier_destroy(&barr))
-			exit_with_error(errno);
+		if (pthread_barrier_destroy(&barr)) {
+			clean_sockets(test, ifobj1);
+			clean_umem(test, ifobj1, NULL);
+			return TEST_FAILURE;
+		}
 
 		/*Spawn TX thread */
 		pthread_create(&t1, NULL, ifobj2->func_ptr, test);

-- 
2.51.0
Re: [PATCH bpf-next v6 12/15] selftests/bpf: test_xsk: Don't exit immediately if validate_traffic fails
Posted by bot+bpf-ci@kernel.org 3 months, 1 week ago
```
commit 5ed620bf5df1b2a38af461580d5207eadf5c552e
Author: Bastien Curutchet (eBPF Foundation) <bastien.curutchet@bootlin.com>

selftests/bpf: test_xsk: Don't exit immediately if validate_traffic fails

This changes __testapp_validate_traffic() to return TEST_FAILURE instead
of calling exit_with_error(), and adds cleanup for sockets and umem
before returning on pthread_barrier_destroy() failure.

> diff --git a/tools/testing/selftests/bpf/test_xsk.c b/tools/testing/selftests/bpf/test_xsk.c
> index 2c392d5b9..18a6ce648 100644
> --- a/tools/testing/selftests/bpf/test_xsk.c
> +++ b/tools/testing/selftests/bpf/test_xsk.c
> @@ -1772,12 +1772,12 @@ static int __testapp_validate_traffic(struct test_spec *test, struct ifobject *i
>  	err = test_spec_set_mtu(test, test->mtu);
>  	if (err) {
>  		ksft_print_msg("Error, could not set mtu.\n");
> -		exit_with_error(err);
> +		return TEST_FAILURE;
>  	}
>
>  	if (ifobj2) {
>  		if (pthread_barrier_init(&barr, NULL, 2))
> -			exit_with_error(errno);
> +			return TEST_FAILURE;
>  		pkt_stream_reset(ifobj2->xsk->pkt_stream);
>  	}
>

[ ... ]

> @@ -1791,8 +1791,11 @@ static int __testapp_validate_traffic(struct test_spec *test, struct ifobject *i
>
>  	if (ifobj2) {
>  		pthread_barrier_wait(&barr);
> -		if (pthread_barrier_destroy(&barr))
> -			exit_with_error(errno);
> +		if (pthread_barrier_destroy(&barr)) {
> +			clean_sockets(test, ifobj1);
> +			clean_umem(test, ifobj1, NULL);
> +			return TEST_FAILURE;
> +		}
>
>  		/*Spawn TX thread */
>  		pthread_create(&t1, NULL, ifobj2->func_ptr, test);

In __testapp_validate_traffic(), thread t0 is created via pthread_create()
before the barrier operations. If pthread_barrier_destroy() fails, can this
leak thread t0?

The pthread_create(&t0, ...) happens earlier in the function. The normal
execution paths handle t0 via pthread_kill() or pthread_join(), but when
pthread_barrier_destroy() fails, the new error path calls clean_sockets()
and clean_umem() but never joins or kills t0 before returning TEST_FAILURE.

The commit message says "Release the resource of the 1st thread if a
failure happens between its creation and the creation of the second
thread", but the code only releases sockets and umem.


```

---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md

In-Reply-To-Subject: `selftests/bpf: test_xsk: Don't exit immediately if validate_traffic fails`
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/18910697393