[PATCH net-next 2/5] selftests/xsk: roll back partial socket setup on configure failures
Tushar Vyavahare <[email protected]>
| Newsgroups | org.kernel.vger.bpf,org.kernel.vger.netdev |
|---|---|
| Message-ID | <[email protected]> |
When xsk_socket__create() fails after all retries, or when busy-poll setup fails after the socket is created, already-configured sockets for the same ifobject are leaked. Add xsk_configure_rollback() to call xsk_delete_socket_batch() on all sockets configured so far, and wire it into both failure paths in xsk_configure(). As part of this change, move xsk_delete_socket_batch() next to xsk_configure_rollback() so rollback helpers are grouped with xsk_configure()-local failure handling. Signed-off-by: Magnus Karlsson <[email protected]> Signed-off-by: Tushar Vyavahare <[email protected]> --- .../selftests/bpf/prog_tests/test_xsk.c | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/test_xsk.c b/tools/testing/selftests/bpf/prog_tests/test_xsk.c index 4ccdb0825130..de0d8f51f846 100644 --- a/tools/testing/selftests/bpf/prog_tests/test_xsk.c +++ b/tools/testing/selftests/bpf/prog_tests/test_xsk.c @@ -1484,6 +1484,28 @@ 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]); +} + +static void xsk_configure_rollback(struct ifobject *ifobject, int last) +{ + u32 count; + + if (!ifobject || last < 0) + return; + + count = last + 1; + xsk_delete_socket_batch(ifobject, count); +} + static int xsk_configure(struct test_spec *test, struct ifobject *ifobject, struct xsk_umem_info *umem, bool tx) { @@ -1500,14 +1522,18 @@ static int xsk_configure(struct test_spec *test, struct ifobject *ifobject, break; /* Retry if it fails as xsk_socket__create() is asynchronous */ - if (ctr >= SOCK_RECONF_CTR) + if (ctr >= SOCK_RECONF_CTR) { + xsk_configure_rollback(ifobject, i); return ret; + } usleep(USLEEP_MAX); } if (ifobject->busy_poll) { ret = enable_busy_poll(&ifobject->xsk_arr[i]); - if (ret) + if (ret) { + xsk_configure_rollback(ifobject, i); return ret; + } } } @@ -1766,17 +1792,6 @@ void xsk_delete_socket(struct xsk_socket_info *xsk) } } -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]); -} - static void xsk_delete_all_ifobj_sockets(struct test_spec *test, struct ifobject *ifobj) { if (!ifobj) -- 2.43.0