xsk: simplify AF_XDP socket teardown
authorBjörn Töpel <bjorn.topel@intel.com>
Wed, 19 Dec 2018 12:09:31 +0000 (13:09 +0100)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 19 Dec 2018 20:45:17 +0000 (21:45 +0100)
Prior this commit, when the struct socket object was being released,
the UMEM did not have its reference count decreased. Instead, this was
done in the struct sock sk_destruct function.

There is no reason to keep the UMEM reference around when the socket
is being orphaned, so in this patch the xdp_put_mem is called in the
xsk_release function. This results in that the xsk_destruct function
can be removed!

Note that, it still holds that a struct xsk_sock reference might still
linger in the XSKMAP after the UMEM is released, e.g. if a user does
not clear the XSKMAP prior to closing the process. This sock will be
in a "released" zombie like state, until the XSKMAP is removed.

Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
net/xdp/xsk.c

index 07156f43d29593ffad99dbd14827fc6352969413..a03268454a2762d12b9dec3e0d3858869e34b742 100644 (file)
@@ -366,6 +366,7 @@ static int xsk_release(struct socket *sock)
 
        xskq_destroy(xs->rx);
        xskq_destroy(xs->tx);
+       xdp_put_umem(xs->umem);
 
        sock_orphan(sk);
        sock->sk = NULL;
@@ -713,18 +714,6 @@ static const struct proto_ops xsk_proto_ops = {
        .sendpage       = sock_no_sendpage,
 };
 
-static void xsk_destruct(struct sock *sk)
-{
-       struct xdp_sock *xs = xdp_sk(sk);
-
-       if (!sock_flag(sk, SOCK_DEAD))
-               return;
-
-       xdp_put_umem(xs->umem);
-
-       sk_refcnt_debug_dec(sk);
-}
-
 static int xsk_create(struct net *net, struct socket *sock, int protocol,
                      int kern)
 {
@@ -751,9 +740,6 @@ static int xsk_create(struct net *net, struct socket *sock, int protocol,
 
        sk->sk_family = PF_XDP;
 
-       sk->sk_destruct = xsk_destruct;
-       sk_refcnt_debug_inc(sk);
-
        sock_set_flag(sk, SOCK_RCU_FREE);
 
        xs = xdp_sk(sk);