]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: add skb_set_owner_edemux() helper
authorEric Dumazet <edumazet@google.com>
Thu, 10 Oct 2024 17:48:15 +0000 (17:48 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 15 Oct 2024 00:39:36 +0000 (17:39 -0700)
This can be used to attach a socket to an skb,
taking a reference on sk->sk_refcnt.

This helper might be a NOP if sk->sk_refcnt is zero.

Use it from tcp_make_synack().

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Brian Vazquez <brianvv@google.com>
Link: https://patch.msgid.link/20241010174817.1543642-4-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/sock.h
net/core/sock.c
net/ipv4/tcp_output.c

index 2f200d91ef115a5f3cbe63d4a5dc944d4bbf94a8..bf7fa3db10ae73670009efc2383625f83e246f7e 100644 (file)
@@ -1760,6 +1760,15 @@ void sock_efree(struct sk_buff *skb);
 #ifdef CONFIG_INET
 void sock_edemux(struct sk_buff *skb);
 void sock_pfree(struct sk_buff *skb);
+
+static inline void skb_set_owner_edemux(struct sk_buff *skb, struct sock *sk)
+{
+       skb_orphan(skb);
+       if (refcount_inc_not_zero(&sk->sk_refcnt)) {
+               skb->sk = sk;
+               skb->destructor = sock_edemux;
+       }
+}
 #else
 #define sock_edemux sock_efree
 #endif
index 083d438d8b6faff60e2e3cf1f982eb306a923cf7..f8c0d4eda888cf190b87fb42e94eef4fb950bf1f 100644 (file)
@@ -2592,14 +2592,11 @@ void __sock_wfree(struct sk_buff *skb)
 void skb_set_owner_w(struct sk_buff *skb, struct sock *sk)
 {
        skb_orphan(skb);
-       skb->sk = sk;
 #ifdef CONFIG_INET
-       if (unlikely(!sk_fullsock(sk))) {
-               skb->destructor = sock_edemux;
-               sock_hold(sk);
-               return;
-       }
+       if (unlikely(!sk_fullsock(sk)))
+               return skb_set_owner_edemux(skb, sk);
 #endif
+       skb->sk = sk;
        skb->destructor = sock_wfree;
        skb_set_hash_from_sk(skb, sk);
        /*
index 06200bb111f8b1f28802e6174c29d86886129dfc..054244ce51175f19f74aaa95d7aacca23ab69476 100644 (file)
@@ -3728,7 +3728,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst,
 
        switch (synack_type) {
        case TCP_SYNACK_NORMAL:
-               skb_set_owner_w(skb, req_to_sk(req));
+               skb_set_owner_edemux(skb, req_to_sk(req));
                break;
        case TCP_SYNACK_COOKIE:
                /* Under synflood, we do not attach skb to a socket,