]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
af_unix: Set drop reason in unix_release_sock().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Thu, 16 Jan 2025 05:34:35 +0000 (14:34 +0900)
committerJakub Kicinski <kuba@kernel.org>
Mon, 20 Jan 2025 19:27:40 +0000 (11:27 -0800)
unix_release_sock() is called when the last refcnt of struct file
is released.

Let's define a new drop reason SKB_DROP_REASON_SOCKET_CLOSE and
set it for kfree_skb() in unix_release_sock().

  # echo 1 > /sys/kernel/tracing/events/skb/kfree_skb/enable

  # python3
  >>> from socket import *
  >>> s1, s2 = socketpair(AF_UNIX)
  >>> s1.send(b'hello world')
  >>> s2.close()

  # cat /sys/kernel/tracing/trace_pipe
  ...
     python3-280 ... kfree_skb: ... protocol=0 location=unix_release_sock+0x260/0x420 reason: SOCKET_CLOSE

To be precise, unix_release_sock() is also called for a new child
socket in unix_stream_connect() when something fails, but the new
sk does not have skb in the recv queue then and no event is logged.

Note that only tcp_inbound_ao_hash() uses a similar drop reason,
SKB_DROP_REASON_TCP_CLOSE, and this can be generalised later.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250116053441.5758-3-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/dropreason-core.h
net/unix/af_unix.c

index f3714cbea50d871d8250da656b5ec3659b41e40c..b9e7ff853ce3684e934dc910f40cd344d318e6d5 100644 (file)
@@ -6,6 +6,7 @@
 #define DEFINE_DROP_REASON(FN, FNe)    \
        FN(NOT_SPECIFIED)               \
        FN(NO_SOCKET)                   \
+       FN(SOCKET_CLOSE)                \
        FN(SOCKET_FILTER)               \
        FN(SOCKET_RCVBUFF)              \
        FN(PKT_TOO_SMALL)               \
@@ -138,6 +139,8 @@ enum skb_drop_reason {
         * 3) no valid child socket during 3WHS process
         */
        SKB_DROP_REASON_NO_SOCKET,
+       /** @SKB_DROP_REASON_SOCKET_CLOSE: socket is close()d */
+       SKB_DROP_REASON_SOCKET_CLOSE,
        /** @SKB_DROP_REASON_SOCKET_FILTER: dropped by socket filter */
        SKB_DROP_REASON_SOCKET_FILTER,
        /** @SKB_DROP_REASON_SOCKET_RCVBUFF: socket receive buff is full */
index 8f2b605ce5b3754baec7ddf62f8197bfcb845865..a05d25cc5545e4144664e712ea3a65206d85c316 100644 (file)
@@ -715,8 +715,8 @@ static void unix_release_sock(struct sock *sk, int embrion)
                if (state == TCP_LISTEN)
                        unix_release_sock(skb->sk, 1);
 
-               /* passed fds are erased in the kfree_skb hook        */
-               kfree_skb(skb);
+               /* passed fds are erased in the kfree_skb hook */
+               kfree_skb_reason(skb, SKB_DROP_REASON_SOCKET_CLOSE);
        }
 
        if (path.dentry)