udp: no longer touch sk->sk_refcnt in early demux
authorEric Dumazet <edumazet@google.com>
Thu, 7 Mar 2024 22:00:16 +0000 (22:00 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Mar 2024 09:56:03 +0000 (09:56 +0000)
After commits ca065d0cf80f ("udp: no longer use SLAB_DESTROY_BY_RCU")
and 7ae215d23c12 ("bpf: Don't refcount LISTEN sockets in sk_assign()")
UDP early demux no longer need to grab a refcount on the UDP socket.

This save two atomic operations per incoming packet for connected
sockets.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Martin KaFai Lau <kafai@fb.com>
Cc: Joe Stringer <joe@wand.net.nz>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Cc: Kuniyuki Iwashima <kuniyu@amazon.com>
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/udp.c
net/ipv6/udp.c

index 43ec4812b60ea6c99647e31eb205479af4e4972d..661d0e0d273f616ad82746b69b2c76d056633017 100644 (file)
@@ -2568,11 +2568,12 @@ int udp_v4_early_demux(struct sk_buff *skb)
                                             uh->source, iph->saddr, dif, sdif);
        }
 
-       if (!sk || !refcount_inc_not_zero(&sk->sk_refcnt))
+       if (!sk)
                return 0;
 
        skb->sk = sk;
-       skb->destructor = sock_efree;
+       DEBUG_NET_WARN_ON_ONCE(sk_is_refcounted(sk));
+       skb->destructor = sock_pfree;
        dst = rcu_dereference(sk->sk_rx_dst);
 
        if (dst)
index 80ad8f436b179d7279cbbd5108c3494a9773c0d8..7c1e6469d091d2252efa5b5ba7270586cef89c29 100644 (file)
@@ -1098,11 +1098,12 @@ void udp_v6_early_demux(struct sk_buff *skb)
        else
                return;
 
-       if (!sk || !refcount_inc_not_zero(&sk->sk_refcnt))
+       if (!sk)
                return;
 
        skb->sk = sk;
-       skb->destructor = sock_efree;
+       DEBUG_NET_WARN_ON_ONCE(sk_is_refcounted(sk));
+       skb->destructor = sock_pfree;
        dst = rcu_dereference(sk->sk_rx_dst);
 
        if (dst)