Re: [PATCH net-next v2 1/5] selftests/xsk: add UMEM users refcount and centralize socket teardown

[email protected]
Newsgroups org.kernel.vger.bpf,org.kernel.vger.netdev
Message-ID <695639f2477a0070c2219414e4359e7f433423322b30d6e8d5759b3b1686ce24@mail.kernel.org>
> diff --git a/tools/testing/selftests/bpf/prog_tests/test_xsk.c b/tools/testing/selftests/bpf/prog_tests/test_xsk.c
> index 38ce6060b8fa..d0c2d0efb97f 100644
> --- a/tools/testing/selftests/bpf/prog_tests/test_xsk.c
> +++ b/tools/testing/selftests/bpf/prog_tests/test_xsk.c

[ ... ]

> @@ -1467,6 +1488,17 @@ static int validate_tx_invalid_descs(struct ifobject *ifobject)
>  	return TEST_PASS;
>  }
>
> +static void xsk_delete_socket_batch(struct ifobject *ifobject, u32 count)
> +{
> +	u32 i;
> +
> +	if (!ifobject)
> +		return;
> +
> +	for (i = count; i > 0; i--)
> +		xsk_delete_socket(&ifobject->xsk_arr[i - 1]);
> +}
> +

[ ... ]

> @@ -1701,12 +1735,61 @@ void *worker_testapp_validate_rx(void *arg)
>  	pthread_exit(NULL);
>  }
>
> -static void testapp_clean_xsk_umem(struct ifobject *ifobj)
> +void xsk_delete_socket(struct xsk_socket_info *xsk)
>  {
> -	struct xsk_umem_info *umem = ifobj->xsk->umem;
> +	struct xsk_umem_info *umem;
> +
> +	if (!xsk)
> +		return;
> +
> +	umem = xsk->umem;
> +	if (!umem)
> +		return;
> +
> +	if (xsk->xsk)
> +		xsk_socket__delete(xsk->xsk);
> +	xsk->xsk = NULL;
> +
> +	/* Skip slots that never acquired a UMEM reference (pre-initialized but unconfigured). */
> +	if (!xsk->umem_ref) {
> +		xsk->umem = NULL;
> +		return;
> +	}

[ ... ]

> +
> +	xsk->umem_ref = false;
> +	xsk->umem = NULL;
> +}
> +
> +static void xsk_delete_all_ifobj_sockets(struct test_spec *test, struct ifobject *ifobj)
> +{
> +	if (!ifobj)
> +		return;
> +
> +	xsk_delete_socket_batch(ifobj, test->nb_sockets);
> +}

This isn't a bug, but could the three functions be simplified?
xsk_delete_all_ifobj_sockets() checks !ifobj, then immediately calls
xsk_delete_socket_batch() which checks !ifobject again, and
xsk_delete_socket_batch() calls xsk_delete_socket(&ifobject->xsk_arr[i - 1])
which checks !xsk a third time even though the address can never be NULL.

Also, xsk_delete_socket_batch() has exactly one caller and is only ever
passed test->nb_sockets, so it doesn't provide any abstraction benefit.


---
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

CI run summary: https://github.com/kernel-patches/bpf/actions/runs/32069138770
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.