Re: [PATCH net-next v2 1/5] selftests/xsk: add UMEM users refcount and centralize socket teardown
| 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