netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATH net 0/2] add drop reason when do fragment
@ 2025-10-24  6:23 Yonglong Li
  2025-10-24  6:23 ` [PATH net 1/2] net: ip: add drop reasons when handling ip fragments Yonglong Li
  2025-10-24  6:23 ` [PATH net 2/2] net: ipv6: use drop reasons in ip6_fragment Yonglong Li
  0 siblings, 2 replies; 7+ messages in thread
From: Yonglong Li @ 2025-10-24  6:23 UTC (permalink / raw)
  To: netdev; +Cc: davem, dsahern, edumazet, pabeni, kuba, horms, liyonglong

Add a new drop reason FRAG_FAILED to trace do fragment failed.
And use drop reasons PKT_TOO_BIG when pkt too big.

Reasons show up as:

perf record -e skb:kfree_skb -a; perf script

  swapper 0 [005] 154.086537: skb:kfree_skb: ... location=ip6_fragment reason: PKT_TOO_BIG
  swapper 0 [005] 154.086540: skb:kfree_skb: ... location=ip6_fragment reason: PKT_TOO_BIG
  swapper 0 [005] 154.086544: skb:kfree_skb: ... location=ip6_fragment reason: PKT_TOO_BIG

Yonglong Li (2):
  net: ip: add drop reasons when handling ip fragments
  net: ipv6: use drop reasons in ip6_fragment

 include/net/dropreason-core.h | 3 +++
 net/ipv4/ip_output.c          | 6 +++---
 net/ipv6/ip6_output.c         | 6 ++++--
 3 files changed, 10 insertions(+), 5 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATH net 1/2] net: ip: add drop reasons when handling ip fragments
  2025-10-24  6:23 [PATH net 0/2] add drop reason when do fragment Yonglong Li
@ 2025-10-24  6:23 ` Yonglong Li
  2025-10-24  6:43   ` Eric Dumazet
  2025-10-24  6:23 ` [PATH net 2/2] net: ipv6: use drop reasons in ip6_fragment Yonglong Li
  1 sibling, 1 reply; 7+ messages in thread
From: Yonglong Li @ 2025-10-24  6:23 UTC (permalink / raw)
  To: netdev; +Cc: davem, dsahern, edumazet, pabeni, kuba, horms, liyonglong

1, add new drop reason FRAG_FAILED, and use it in ip_do_fragment
2, use drop reasons PKT_TOO_BIG in ip_fragment

Signed-off-by: Yonglong Li <liyonglong@chinatelecom.cn>
---
 include/net/dropreason-core.h | 3 +++
 net/ipv4/ip_output.c          | 6 +++---
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
index 58d91cc..7da80f4 100644
--- a/include/net/dropreason-core.h
+++ b/include/net/dropreason-core.h
@@ -99,6 +99,7 @@
 	FN(DUP_FRAG)			\
 	FN(FRAG_REASM_TIMEOUT)		\
 	FN(FRAG_TOO_FAR)		\
+	FN(FRAG_FAILED)			\
 	FN(TCP_MINTTL)			\
 	FN(IPV6_BAD_EXTHDR)		\
 	FN(IPV6_NDISC_FRAG)		\
@@ -500,6 +501,8 @@ enum skb_drop_reason {
 	 * (/proc/sys/net/ipv4/ipfrag_max_dist)
 	 */
 	SKB_DROP_REASON_FRAG_TOO_FAR,
+	/* do ip/ip6 fragment failed */
+	SKB_DROP_REASON_FRAG_FAILED,
 	/**
 	 * @SKB_DROP_REASON_TCP_MINTTL: ipv4 ttl or ipv6 hoplimit below
 	 * the threshold (IP_MINTTL or IPV6_MINHOPCOUNT).
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index ff11d3a..879fe49 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -588,7 +588,7 @@ static int ip_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 		IP_INC_STATS(net, IPSTATS_MIB_FRAGFAILS);
 		icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
 			  htonl(mtu));
-		kfree_skb(skb);
+		kfree_skb_reason(skb, SKB_DROP_REASON_PKT_TOO_BIG);
 		return -EMSGSIZE;
 	}
 
@@ -871,7 +871,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 			return 0;
 		}
 
-		kfree_skb_list(iter.frag);
+		kfree_skb_list_reason(iter.frag, SKB_DROP_REASON_FRAG_FAILED);
 
 		IP_INC_STATS(net, IPSTATS_MIB_FRAGFAILS);
 		return err;
@@ -923,7 +923,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 	return err;
 
 fail:
-	kfree_skb(skb);
+	kfree_skb_reason(skb, SKB_DROP_REASON_FRAG_FAILED);
 	IP_INC_STATS(net, IPSTATS_MIB_FRAGFAILS);
 	return err;
 }
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATH net 2/2] net: ipv6: use drop reasons in ip6_fragment
  2025-10-24  6:23 [PATH net 0/2] add drop reason when do fragment Yonglong Li
  2025-10-24  6:23 ` [PATH net 1/2] net: ip: add drop reasons when handling ip fragments Yonglong Li
@ 2025-10-24  6:23 ` Yonglong Li
  2025-10-24  6:45   ` Eric Dumazet
  1 sibling, 1 reply; 7+ messages in thread
From: Yonglong Li @ 2025-10-24  6:23 UTC (permalink / raw)
  To: netdev; +Cc: davem, dsahern, edumazet, pabeni, kuba, horms, liyonglong

use drop reasons in ip6_output like ip_fragment/ip_do_fragment

Signed-off-by: Yonglong Li <liyonglong@chinatelecom.cn>
---
 net/ipv6/ip6_output.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index f904739e..575c7d1 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -875,6 +875,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 		 int (*output)(struct net *, struct sock *, struct sk_buff *))
 {
 	struct sk_buff *frag;
+	enum skb_drop_reason reason = SKB_DROP_REASON_FRAG_FAILED;
 	struct rt6_info *rt = dst_rt6_info(skb_dst(skb));
 	struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ?
 				inet6_sk(skb->sk) : NULL;
@@ -995,7 +996,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 			return 0;
 		}
 
-		kfree_skb_list(iter.frag);
+		kfree_skb_list_reason(iter.frag, reason);
 
 		IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
 			      IPSTATS_MIB_FRAGFAILS);
@@ -1050,12 +1051,13 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 
 fail_toobig:
 	icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
+	reason = SKB_DROP_REASON_PKT_TOO_BIG;
 	err = -EMSGSIZE;
 
 fail:
 	IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
 		      IPSTATS_MIB_FRAGFAILS);
-	kfree_skb(skb);
+	kfree_skb_reason(skb, reason);
 	return err;
 }
 
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATH net 1/2] net: ip: add drop reasons when handling ip fragments
  2025-10-24  6:23 ` [PATH net 1/2] net: ip: add drop reasons when handling ip fragments Yonglong Li
@ 2025-10-24  6:43   ` Eric Dumazet
  2025-10-24  9:56     ` YonglongLi
  2025-10-24 15:57     ` Simon Horman
  0 siblings, 2 replies; 7+ messages in thread
From: Eric Dumazet @ 2025-10-24  6:43 UTC (permalink / raw)
  To: Yonglong Li; +Cc: netdev, davem, dsahern, pabeni, kuba, horms

On Thu, Oct 23, 2025 at 11:23 PM Yonglong Li <liyonglong@chinatelecom.cn> wrote:
>
> 1, add new drop reason FRAG_FAILED, and use it in ip_do_fragment
> 2, use drop reasons PKT_TOO_BIG in ip_fragment
>
> Signed-off-by: Yonglong Li <liyonglong@chinatelecom.cn>
> ---
>  include/net/dropreason-core.h | 3 +++
>  net/ipv4/ip_output.c          | 6 +++---
>  2 files changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
> index 58d91cc..7da80f4 100644
> --- a/include/net/dropreason-core.h
> +++ b/include/net/dropreason-core.h
> @@ -99,6 +99,7 @@
>         FN(DUP_FRAG)                    \
>         FN(FRAG_REASM_TIMEOUT)          \
>         FN(FRAG_TOO_FAR)                \
> +       FN(FRAG_FAILED)                 \
>         FN(TCP_MINTTL)                  \
>         FN(IPV6_BAD_EXTHDR)             \
>         FN(IPV6_NDISC_FRAG)             \
> @@ -500,6 +501,8 @@ enum skb_drop_reason {
>          * (/proc/sys/net/ipv4/ipfrag_max_dist)
>          */
>         SKB_DROP_REASON_FRAG_TOO_FAR,
> +       /* do ip/ip6 fragment failed */
> +       SKB_DROP_REASON_FRAG_FAILED,
>         /**
>          * @SKB_DROP_REASON_TCP_MINTTL: ipv4 ttl or ipv6 hoplimit below
>          * the threshold (IP_MINTTL or IPV6_MINHOPCOUNT).
> diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
> index ff11d3a..879fe49 100644
> --- a/net/ipv4/ip_output.c
> +++ b/net/ipv4/ip_output.c
> @@ -588,7 +588,7 @@ static int ip_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
>                 IP_INC_STATS(net, IPSTATS_MIB_FRAGFAILS);
>                 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
>                           htonl(mtu));
> -               kfree_skb(skb);
> +               kfree_skb_reason(skb, SKB_DROP_REASON_PKT_TOO_BIG);

This part looks fine.

>                 return -EMSGSIZE;
>         }
>
> @@ -871,7 +871,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
>                         return 0;
>                 }
>
> -               kfree_skb_list(iter.frag);
> +               kfree_skb_list_reason(iter.frag, SKB_DROP_REASON_FRAG_FAILED);
>
>                 IP_INC_STATS(net, IPSTATS_MIB_FRAGFAILS);
>                 return err;
> @@ -923,7 +923,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
>         return err;
>
>  fail:
> -       kfree_skb(skb);
> +       kfree_skb_reason(skb, SKB_DROP_REASON_FRAG_FAILED);

There are many different reasons for the possible failures ?
skb_checksum_help() error,
ip_frag_next() error
output() error.

I think that having the distinction could really help, especially the
output() one...

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATH net 2/2] net: ipv6: use drop reasons in ip6_fragment
  2025-10-24  6:23 ` [PATH net 2/2] net: ipv6: use drop reasons in ip6_fragment Yonglong Li
@ 2025-10-24  6:45   ` Eric Dumazet
  0 siblings, 0 replies; 7+ messages in thread
From: Eric Dumazet @ 2025-10-24  6:45 UTC (permalink / raw)
  To: Yonglong Li; +Cc: netdev, davem, dsahern, pabeni, kuba, horms

On Thu, Oct 23, 2025 at 11:23 PM Yonglong Li <liyonglong@chinatelecom.cn> wrote:
>
> use drop reasons in ip6_output like ip_fragment/ip_do_fragment
>
> Signed-off-by: Yonglong Li <liyonglong@chinatelecom.cn>
> ---
>  net/ipv6/ip6_output.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
> index f904739e..575c7d1 100644
> --- a/net/ipv6/ip6_output.c
> +++ b/net/ipv6/ip6_output.c
> @@ -875,6 +875,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
>                  int (*output)(struct net *, struct sock *, struct sk_buff *))
>  {
>         struct sk_buff *frag;
> +       enum skb_drop_reason reason = SKB_DROP_REASON_FRAG_FAILED;

Reverse Christmas .... move this one line up, or move "struct sk_buff *frag;"

>         struct rt6_info *rt = dst_rt6_info(skb_dst(skb));
>         struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ?
>                                 inet6_sk(skb->sk) : NULL;
> @@ -995,7 +996,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
>                         return 0;
>                 }
>
> -               kfree_skb_list(iter.frag);
> +               kfree_skb_list_reason(iter.frag, reason);
>
>                 IP6_INC_STATS(net, ip6_dst_idev(&rt->dst),
>                               IPSTATS_MIB_FRAGFAILS);
> @@ -1050,12 +1051,13 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
>
>  fail_toobig:
>         icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
> +       reason = SKB_DROP_REASON_PKT_TOO_BIG;
>         err = -EMSGSIZE;
>
>  fail:
>         IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)),
>                       IPSTATS_MIB_FRAGFAILS);
> -       kfree_skb(skb);
> +       kfree_skb_reason(skb, reason);

Same remark as the IPv4 part.

>         return err;
>  }
>
> --
> 1.8.3.1
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATH net 1/2] net: ip: add drop reasons when handling ip fragments
  2025-10-24  6:43   ` Eric Dumazet
@ 2025-10-24  9:56     ` YonglongLi
  2025-10-24 15:57     ` Simon Horman
  1 sibling, 0 replies; 7+ messages in thread
From: YonglongLi @ 2025-10-24  9:56 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: netdev


On 10/24/2025 14:43,  Eric Dumazet wrote:
> On Thu, Oct 23, 2025 at 11:23 PM Yonglong Li <liyonglong@chinatelecom.cn> wrote:
> 
>>                 return -EMSGSIZE;
>>         }
>>
>> @@ -871,7 +871,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
>>                         return 0;
>>                 }
>>
>> -               kfree_skb_list(iter.frag);
>> +               kfree_skb_list_reason(iter.frag, SKB_DROP_REASON_FRAG_FAILED);
>>
>>                 IP_INC_STATS(net, IPSTATS_MIB_FRAGFAILS);
>>                 return err;
>> @@ -923,7 +923,7 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
>>         return err;
>>
>>  fail:
>> -       kfree_skb(skb);
>> +       kfree_skb_reason(skb, SKB_DROP_REASON_FRAG_FAILED);
> 
> There are many different reasons for the possible failures ?
> skb_checksum_help() error,
> ip_frag_next() error
> output() error.
> 
> I think that having the distinction could really help, especially the
> output() one..

Hi Eric,

Thank you for for the suggestion. I will send a v2 with these case.

-- 
Li YongLong


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATH net 1/2] net: ip: add drop reasons when handling ip fragments
  2025-10-24  6:43   ` Eric Dumazet
  2025-10-24  9:56     ` YonglongLi
@ 2025-10-24 15:57     ` Simon Horman
  1 sibling, 0 replies; 7+ messages in thread
From: Simon Horman @ 2025-10-24 15:57 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: Yonglong Li, netdev, davem, dsahern, pabeni, kuba

On Thu, Oct 23, 2025 at 11:43:25PM -0700, Eric Dumazet wrote:
> On Thu, Oct 23, 2025 at 11:23 PM Yonglong Li <liyonglong@chinatelecom.cn> wrote:
> >
> > 1, add new drop reason FRAG_FAILED, and use it in ip_do_fragment
> > 2, use drop reasons PKT_TOO_BIG in ip_fragment
> >
> > Signed-off-by: Yonglong Li <liyonglong@chinatelecom.cn>
> > ---
> >  include/net/dropreason-core.h | 3 +++
> >  net/ipv4/ip_output.c          | 6 +++---
> >  2 files changed, 6 insertions(+), 3 deletions(-)
> >
> > diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
> > index 58d91cc..7da80f4 100644
> > --- a/include/net/dropreason-core.h
> > +++ b/include/net/dropreason-core.h
> > @@ -99,6 +99,7 @@
> >         FN(DUP_FRAG)                    \
> >         FN(FRAG_REASM_TIMEOUT)          \
> >         FN(FRAG_TOO_FAR)                \
> > +       FN(FRAG_FAILED)                 \
> >         FN(TCP_MINTTL)                  \
> >         FN(IPV6_BAD_EXTHDR)             \
> >         FN(IPV6_NDISC_FRAG)             \
> > @@ -500,6 +501,8 @@ enum skb_drop_reason {
> >          * (/proc/sys/net/ipv4/ipfrag_max_dist)
> >          */
> >         SKB_DROP_REASON_FRAG_TOO_FAR,
> > +       /* do ip/ip6 fragment failed */

nit; This comment should be a Kernel doc, like the comments
     for other members of this enum.

> > +       SKB_DROP_REASON_FRAG_FAILED,
> >         /**
> >          * @SKB_DROP_REASON_TCP_MINTTL: ipv4 ttl or ipv6 hoplimit below
> >          * the threshold (IP_MINTTL or IPV6_MINHOPCOUNT).

...

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-10-24 15:57 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-24  6:23 [PATH net 0/2] add drop reason when do fragment Yonglong Li
2025-10-24  6:23 ` [PATH net 1/2] net: ip: add drop reasons when handling ip fragments Yonglong Li
2025-10-24  6:43   ` Eric Dumazet
2025-10-24  9:56     ` YonglongLi
2025-10-24 15:57     ` Simon Horman
2025-10-24  6:23 ` [PATH net 2/2] net: ipv6: use drop reasons in ip6_fragment Yonglong Li
2025-10-24  6:45   ` Eric Dumazet

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).