]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: skb: use kfree_skb_reason() in tcp_v4_rcv()
authorMenglong Dong <imagedong@tencent.com>
Sun, 9 Jan 2022 06:36:27 +0000 (14:36 +0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 10 Jan 2022 00:30:34 +0000 (16:30 -0800)
Replace kfree_skb() with kfree_skb_reason() in tcp_v4_rcv(). Following
drop reasons are added:

SKB_DROP_REASON_NO_SOCKET
SKB_DROP_REASON_PKT_TOO_SMALL
SKB_DROP_REASON_TCP_CSUM
SKB_DROP_REASON_TCP_FILTER

After this patch, 'kfree_skb' event will print message like this:

$           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
$              | |         |   |||||     |         |
          <idle>-0       [000] ..s1.    36.113438: kfree_skb: skbaddr=(____ptrval____) protocol=2048 location=(____ptrval____) reason: NO_SOCKET

The reason of skb drop is printed too.

Signed-off-by: Menglong Dong <imagedong@tencent.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/skbuff.h
include/trace/events/skb.h
net/ipv4/tcp_ipv4.c

index ef0870abc791c959bf039eb432c3df06c205f1de..c9c97b0d0fe9ef0cbda554b0060586ce6a58366a 100644 (file)
@@ -313,6 +313,10 @@ struct sk_buff;
  */
 enum skb_drop_reason {
        SKB_DROP_REASON_NOT_SPECIFIED,
+       SKB_DROP_REASON_NO_SOCKET,
+       SKB_DROP_REASON_PKT_TOO_SMALL,
+       SKB_DROP_REASON_TCP_CSUM,
+       SKB_DROP_REASON_TCP_FILTER,
        SKB_DROP_REASON_MAX,
 };
 
index 294c61bbe44b6e65236e4c6e6297c26d9efab3b5..faa7d068a7bc0e6b4c8520930a11bd0e57ef89d8 100644 (file)
 
 #define TRACE_SKB_DROP_REASON                                  \
        EM(SKB_DROP_REASON_NOT_SPECIFIED, NOT_SPECIFIED)        \
+       EM(SKB_DROP_REASON_NO_SOCKET, NO_SOCKET)                \
+       EM(SKB_DROP_REASON_PKT_TOO_SMALL, PKT_TOO_SMALL)        \
+       EM(SKB_DROP_REASON_TCP_CSUM, TCP_CSUM)                  \
+       EM(SKB_DROP_REASON_TCP_FILTER, TCP_FILTER)              \
        EMe(SKB_DROP_REASON_MAX, MAX)
 
 #undef EM
index 9861786b8336533bd926a81c89593d7ab41270d7..b3f34e366b27f7f1aece164aa485b1e9a7248d93 100644 (file)
@@ -1971,8 +1971,10 @@ int tcp_v4_rcv(struct sk_buff *skb)
        const struct tcphdr *th;
        bool refcounted;
        struct sock *sk;
+       int drop_reason;
        int ret;
 
+       drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
        if (skb->pkt_type != PACKET_HOST)
                goto discard_it;
 
@@ -1984,8 +1986,10 @@ int tcp_v4_rcv(struct sk_buff *skb)
 
        th = (const struct tcphdr *)skb->data;
 
-       if (unlikely(th->doff < sizeof(struct tcphdr) / 4))
+       if (unlikely(th->doff < sizeof(struct tcphdr) / 4)) {
+               drop_reason = SKB_DROP_REASON_PKT_TOO_SMALL;
                goto bad_packet;
+       }
        if (!pskb_may_pull(skb, th->doff * 4))
                goto discard_it;
 
@@ -2090,8 +2094,10 @@ process:
 
        nf_reset_ct(skb);
 
-       if (tcp_filter(sk, skb))
+       if (tcp_filter(sk, skb)) {
+               drop_reason = SKB_DROP_REASON_TCP_FILTER;
                goto discard_and_relse;
+       }
        th = (const struct tcphdr *)skb->data;
        iph = ip_hdr(skb);
        tcp_v4_fill_cb(skb, iph, th);
@@ -2124,6 +2130,7 @@ put_and_return:
        return ret;
 
 no_tcp_socket:
+       drop_reason = SKB_DROP_REASON_NO_SOCKET;
        if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
                goto discard_it;
 
@@ -2131,6 +2138,7 @@ no_tcp_socket:
 
        if (tcp_checksum_complete(skb)) {
 csum_error:
+               drop_reason = SKB_DROP_REASON_TCP_CSUM;
                trace_tcp_bad_csum(skb);
                __TCP_INC_STATS(net, TCP_MIB_CSUMERRORS);
 bad_packet:
@@ -2141,7 +2149,7 @@ bad_packet:
 
 discard_it:
        /* Discard frame. */
-       kfree_skb(skb);
+       kfree_skb_reason(skb, drop_reason);
        return 0;
 
 discard_and_relse: