selftests/xsk: do not close unused file descriptors
authorMagnus Karlsson <magnus.karlsson@intel.com>
Wed, 11 Jan 2023 09:35:13 +0000 (10:35 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 12 Jan 2023 02:16:51 +0000 (18:16 -0800)
Do not close descriptors that have never been used. File descriptor
fields that are not in use are erroneously marked with the number 0,
which is a valid fd. Mark unused fds with -1 instead and do not close
these when deleting the socket.

Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Link: https://lore.kernel.org/r/20230111093526.11682-3-magnus.karlsson@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/xsk.c

index 39d3495..5e4a655 100644 (file)
@@ -35,6 +35,8 @@
 #include "xsk.h"
 #include "bpf_util.h"
 
+#define FD_NOT_USED (-1)
+
 #ifndef SOL_XDP
  #define SOL_XDP 283
 #endif
@@ -583,6 +585,9 @@ static void xsk_delete_bpf_maps(struct xsk_socket *xsk)
 {
        struct xsk_ctx *ctx = xsk->ctx;
 
+       if (ctx->xsks_map_fd == FD_NOT_USED)
+               return;
+
        bpf_map_delete_elem(ctx->xsks_map_fd, &ctx->queue_id);
        close(ctx->xsks_map_fd);
 }
@@ -941,6 +946,9 @@ static struct xsk_ctx *xsk_create_ctx(struct xsk_socket *xsk,
        ctx->umem = umem;
        ctx->queue_id = queue_id;
        bpf_strlcpy(ctx->ifname, ifname, IFNAMSIZ);
+       ctx->prog_fd = FD_NOT_USED;
+       ctx->link_fd = FD_NOT_USED;
+       ctx->xsks_map_fd = FD_NOT_USED;
 
        ctx->fill = fill;
        ctx->comp = comp;
@@ -1221,8 +1229,9 @@ void xsk_socket__delete(struct xsk_socket *xsk)
 
        if (ctx->refcount == 1) {
                xsk_delete_bpf_maps(xsk);
-               close(ctx->prog_fd);
-               if (ctx->has_bpf_link)
+               if (ctx->prog_fd != FD_NOT_USED)
+                       close(ctx->prog_fd);
+               if (ctx->has_bpf_link && ctx->link_fd != FD_NOT_USED)
                        close(ctx->link_fd);
        }