diff mbox series

[net-next,2/2] net: skb: use kfree_skb_with_reason() in tcp_v4_rcv()

Message ID 20211229143205.410731-3-imagedong@tencent.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series net: skb: introduce kfree_skb_with_reason() | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix success Link
netdev/cover_letter success Series has a cover letter
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 6051 this patch: 6051
netdev/cc_maintainers success CCed 10 of 10 maintainers
netdev/build_clang success Errors and warnings before: 1011 this patch: 1011
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 6202 this patch: 6202
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 61 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Menglong Dong Dec. 29, 2021, 2:32 p.m. UTC
From: Menglong Dong <imagedong@tencent.com>

Replace kfree_skb() with kfree_skb_with_reason() in tcp_v4_rcv().
Following drop reason are added:

SKB_DROP_REASON_NO_SOCK
SKB_DROP_REASON_BAD_PACKET
SKB_DROP_REASON_TCP_CSUM

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_SOCK

The reason of skb drop is printed too.

Signed-off-by: Menglong Dong <imagedong@tencent.com>
---
 include/linux/skbuff.h     |  3 +++
 include/trace/events/skb.h |  3 +++
 net/ipv4/tcp_ipv4.c        | 10 ++++++++--
 3 files changed, 14 insertions(+), 2 deletions(-)

Comments

David Ahern Dec. 29, 2021, 8:18 p.m. UTC | #1
On 12/29/21 7:32 AM, menglong8.dong@gmail.com wrote:
> From: Menglong Dong <imagedong@tencent.com>
> 
> Replace kfree_skb() with kfree_skb_with_reason() in tcp_v4_rcv().
> Following drop reason are added:
> 
> SKB_DROP_REASON_NO_SOCK
> SKB_DROP_REASON_BAD_PACKET
> SKB_DROP_REASON_TCP_CSUM
> 
> 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_SOCK
> 
> The reason of skb drop is printed too.
> 
> Signed-off-by: Menglong Dong <imagedong@tencent.com>
> ---
>  include/linux/skbuff.h     |  3 +++
>  include/trace/events/skb.h |  3 +++
>  net/ipv4/tcp_ipv4.c        | 10 ++++++++--

your first patch set was targeting UDP and now you are starting with tcp?


>  3 files changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> index 3620b3ff2154..f85db6c035d1 100644
> --- a/include/linux/skbuff.h
> +++ b/include/linux/skbuff.h
> @@ -313,6 +313,9 @@ struct sk_buff;
>   */
>  enum skb_drop_reason {
>  	SKB_DROP_REASON_NOT_SPECIFIED,
> +	SKB_DROP_REASON_NO_SOCK,

SKB_DROP_REASON_NO_SOCKET

> +	SKB_DROP_REASON_BAD_PACKET,

SKB_DROP_REASON_PKT_TOO_SMALL

User oriented messages, not code based.


> +	SKB_DROP_REASON_TCP_CSUM,
>  	SKB_DROP_REASON_MAX,
>  };
>  
> diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h
> index cab1c08a30cd..b9ea6b4ed7ec 100644
> --- a/include/trace/events/skb.h
> +++ b/include/trace/events/skb.h
> @@ -11,6 +11,9 @@
>  
>  #define TRACE_SKB_DROP_REASON					\
>  	EM(SKB_DROP_REASON_NOT_SPECIFIED, NOT_SPECIFIED)	\
> +	EM(SKB_DROP_REASON_NO_SOCK, NO_SOCK)			\
> +	EM(SKB_DROP_REASON_BAD_PACKET, BAD_PACKET)		\
> +	EM(SKB_DROP_REASON_TCP_CSUM, TCP_CSUM)			\
>  	EMe(SKB_DROP_REASON_MAX, HAHA_MAX)
>  
>  #undef EM
> diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
> index ac10e4cdd8d0..03dc4c79b84b 100644
> --- a/net/ipv4/tcp_ipv4.c
> +++ b/net/ipv4/tcp_ipv4.c
> @@ -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 = 0;

	drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
Menglong Dong Dec. 30, 2021, 2:36 a.m. UTC | #2
On Thu, Dec 30, 2021 at 4:18 AM David Ahern <dsahern@gmail.com> wrote:
>
> On 12/29/21 7:32 AM, menglong8.dong@gmail.com wrote:
> > From: Menglong Dong <imagedong@tencent.com>
> >
> > Replace kfree_skb() with kfree_skb_with_reason() in tcp_v4_rcv().
> > Following drop reason are added:
> >
> > SKB_DROP_REASON_NO_SOCK
> > SKB_DROP_REASON_BAD_PACKET
> > SKB_DROP_REASON_TCP_CSUM
> >
> > 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_SOCK
> >
> > The reason of skb drop is printed too.
> >
> > Signed-off-by: Menglong Dong <imagedong@tencent.com>
> > ---
> >  include/linux/skbuff.h     |  3 +++
> >  include/trace/events/skb.h |  3 +++
> >  net/ipv4/tcp_ipv4.c        | 10 ++++++++--
>
> your first patch set was targeting UDP and now you are starting with tcp?

Yeah, I think TCP is used more, which can be a good starting point. After
all, general protocols are all my target.

>
>
> >  3 files changed, 14 insertions(+), 2 deletions(-)
> >
> > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> > index 3620b3ff2154..f85db6c035d1 100644
> > --- a/include/linux/skbuff.h
> > +++ b/include/linux/skbuff.h
> > @@ -313,6 +313,9 @@ struct sk_buff;
> >   */
> >  enum skb_drop_reason {
> >       SKB_DROP_REASON_NOT_SPECIFIED,
> > +     SKB_DROP_REASON_NO_SOCK,
>
> SKB_DROP_REASON_NO_SOCKET
>
> > +     SKB_DROP_REASON_BAD_PACKET,
>
> SKB_DROP_REASON_PKT_TOO_SMALL
>
> User oriented messages, not code based.
>

Ok, get it!

Thanks!
Menglong Dong

>
> > +     SKB_DROP_REASON_TCP_CSUM,
> >       SKB_DROP_REASON_MAX,
> >  };
> >
> > diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h
> > index cab1c08a30cd..b9ea6b4ed7ec 100644
> > --- a/include/trace/events/skb.h
> > +++ b/include/trace/events/skb.h
> > @@ -11,6 +11,9 @@
> >
> >  #define TRACE_SKB_DROP_REASON                                        \
> >       EM(SKB_DROP_REASON_NOT_SPECIFIED, NOT_SPECIFIED)        \
> > +     EM(SKB_DROP_REASON_NO_SOCK, NO_SOCK)                    \
> > +     EM(SKB_DROP_REASON_BAD_PACKET, BAD_PACKET)              \
> > +     EM(SKB_DROP_REASON_TCP_CSUM, TCP_CSUM)                  \
> >       EMe(SKB_DROP_REASON_MAX, HAHA_MAX)
> >
> >  #undef EM
> > diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
> > index ac10e4cdd8d0..03dc4c79b84b 100644
> > --- a/net/ipv4/tcp_ipv4.c
> > +++ b/net/ipv4/tcp_ipv4.c
> > @@ -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 = 0;
>
>         drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
>
diff mbox series

Patch

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 3620b3ff2154..f85db6c035d1 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -313,6 +313,9 @@  struct sk_buff;
  */
 enum skb_drop_reason {
 	SKB_DROP_REASON_NOT_SPECIFIED,
+	SKB_DROP_REASON_NO_SOCK,
+	SKB_DROP_REASON_BAD_PACKET,
+	SKB_DROP_REASON_TCP_CSUM,
 	SKB_DROP_REASON_MAX,
 };
 
diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h
index cab1c08a30cd..b9ea6b4ed7ec 100644
--- a/include/trace/events/skb.h
+++ b/include/trace/events/skb.h
@@ -11,6 +11,9 @@ 
 
 #define TRACE_SKB_DROP_REASON					\
 	EM(SKB_DROP_REASON_NOT_SPECIFIED, NOT_SPECIFIED)	\
+	EM(SKB_DROP_REASON_NO_SOCK, NO_SOCK)			\
+	EM(SKB_DROP_REASON_BAD_PACKET, BAD_PACKET)		\
+	EM(SKB_DROP_REASON_TCP_CSUM, TCP_CSUM)			\
 	EMe(SKB_DROP_REASON_MAX, HAHA_MAX)
 
 #undef EM
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index ac10e4cdd8d0..03dc4c79b84b 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -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 = 0;
 	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_BAD_PACKET;
 		goto bad_packet;
+	}
 	if (!pskb_may_pull(skb, th->doff * 4))
 		goto discard_it;
 
@@ -2124,6 +2128,7 @@  int tcp_v4_rcv(struct sk_buff *skb)
 	return ret;
 
 no_tcp_socket:
+	drop_reason = SKB_DROP_REASON_NO_SOCK;
 	if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
 		goto discard_it;
 
@@ -2131,6 +2136,7 @@  int tcp_v4_rcv(struct sk_buff *skb)
 
 	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 +2147,7 @@  int tcp_v4_rcv(struct sk_buff *skb)
 
 discard_it:
 	/* Discard frame. */
-	kfree_skb(skb);
+	kfree_skb_with_reason(skb, drop_reason);
 	return 0;
 
 discard_and_relse: