diff mbox series

[net-next] net: always dump full packets with skb_dump

Message ID 20201005144838.851988-1-vladimir.oltean@nxp.com
State New
Headers show
Series [net-next] net: always dump full packets with skb_dump | expand

Commit Message

Vladimir Oltean Oct. 5, 2020, 2:48 p.m. UTC
Currently skb_dump has a restriction to only dump full packet for the
first 5 socket buffers, then only headers will be printed. Remove this
arbitrary and confusing restriction, which is only documented vaguely
("up to") in the comments above the prototype.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
 net/core/skbuff.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

Comments

Keller, Jacob E Oct. 5, 2020, 10:13 p.m. UTC | #1
On 10/5/2020 7:48 AM, Vladimir Oltean wrote:
> Currently skb_dump has a restriction to only dump full packet for the
> first 5 socket buffers, then only headers will be printed. Remove this
> arbitrary and confusing restriction, which is only documented vaguely
> ("up to") in the comments above the prototype.
> 

So, this limitation appeared very clearly in the original commit,
6413139dfc64 ("skbuff: increase verbosity when dumping skb data")..

Searching the netdev list, that patch links back to this one as the
original idea:

https://patchwork.ozlabs.org/project/netdev/patch/20181121021309.6595-2-xiyou.wangcong@gmail.com/

I can't find any further justification on that limit. I suppose the
primary reasoning being if you somehow call this function in a loop this
would avoid dumping the entire packet over and over?

Thanks,
Jake

> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
> ---
>  net/core/skbuff.c | 6 +-----
>  1 file changed, 1 insertion(+), 5 deletions(-)
> 
> diff --git a/net/core/skbuff.c b/net/core/skbuff.c
> index e0774471f56d..720076a6e2b1 100644
> --- a/net/core/skbuff.c
> +++ b/net/core/skbuff.c
> @@ -712,11 +712,10 @@ EXPORT_SYMBOL(kfree_skb_list);
>   *
>   * Must only be called from net_ratelimit()-ed paths.
>   *
> - * Dumps up to can_dump_full whole packets if full_pkt, headers otherwise.
> + * Dumps whole packets if full_pkt, only headers otherwise.
>   */
>  void skb_dump(const char *level, const struct sk_buff *skb, bool full_pkt)
>  {
> -	static atomic_t can_dump_full = ATOMIC_INIT(5);
>  	struct skb_shared_info *sh = skb_shinfo(skb);
>  	struct net_device *dev = skb->dev;
>  	struct sock *sk = skb->sk;
> @@ -725,9 +724,6 @@ void skb_dump(const char *level, const struct sk_buff *skb, bool full_pkt)
>  	int headroom, tailroom;
>  	int i, len, seg_len;
>  
> -	if (full_pkt)
> -		full_pkt = atomic_dec_if_positive(&can_dump_full) >= 0;
> -
>  	if (full_pkt)
>  		len = skb->len;
>  	else
>
Willem de Bruijn Oct. 6, 2020, 11:30 a.m. UTC | #2
On Mon, Oct 5, 2020 at 8:25 PM Jacob Keller <jacob.e.keller@intel.com> wrote:
>

>

>

> On 10/5/2020 7:48 AM, Vladimir Oltean wrote:

> > Currently skb_dump has a restriction to only dump full packet for the

> > first 5 socket buffers, then only headers will be printed. Remove this

> > arbitrary and confusing restriction, which is only documented vaguely

> > ("up to") in the comments above the prototype.

> >

>

> So, this limitation appeared very clearly in the original commit,

> 6413139dfc64 ("skbuff: increase verbosity when dumping skb data")..

>

> Searching the netdev list, that patch links back to this one as the

> original idea:

>

> https://patchwork.ozlabs.org/project/netdev/patch/20181121021309.6595-2-xiyou.wangcong@gmail.com/

>

> I can't find any further justification on that limit. I suppose the

> primary reasoning being if you somehow call this function in a loop this

> would avoid dumping the entire packet over and over?


Not in a loop per se, but indeed to avoid unbounded writing to the kernel log.

skb_dump is called from skb_warn_bad_offload and netdev_rx_csum_fault.
Previously when these were triggered, a few example bad packets were
sufficient to debug the issue.

A full dump can add a lot of data to the kernel log, so I limited to
what is strictly needed.
Vladimir Oltean Oct. 6, 2020, 11:43 a.m. UTC | #3
On Tue, Oct 06, 2020 at 07:30:13AM -0400, Willem de Bruijn wrote:
> skb_dump is called from skb_warn_bad_offload and netdev_rx_csum_fault.

> Previously when these were triggered, a few example bad packets were

> sufficient to debug the issue.


Yes, and it's only netdev_rx_csum_fault that matters, because
skb_warn_bad_offload calls with full_pkt=false anyway.

During the times when I had netdev_rx_csum_fault triggered, it was
pretty bad anyway. I don't think that full_pkt getting unset after 5
skbs made too big of a difference.

> A full dump can add a lot of data to the kernel log, so I limited to

> what is strictly needed.


Yes, well my expectation is that other people are using skb_dump for
debugging, even beyond those 2 callers in the mainline kernel. And when
they want to dump with full_pkt=true, they really want to dump with
full_pkt=true.

Thanks,
-Vladimir
Willem de Bruijn Oct. 6, 2020, 11:57 a.m. UTC | #4
On Tue, Oct 6, 2020 at 7:43 AM Vladimir Oltean <vladimir.oltean@nxp.com> wrote:
>
> On Tue, Oct 06, 2020 at 07:30:13AM -0400, Willem de Bruijn wrote:
> > skb_dump is called from skb_warn_bad_offload and netdev_rx_csum_fault.
> > Previously when these were triggered, a few example bad packets were
> > sufficient to debug the issue.
>
> Yes, and it's only netdev_rx_csum_fault that matters, because
> skb_warn_bad_offload calls with full_pkt=false anyway.
>
> During the times when I had netdev_rx_csum_fault triggered, it was
> pretty bad anyway. I don't think that full_pkt getting unset after 5
> skbs made too big of a difference.
>
> > A full dump can add a lot of data to the kernel log, so I limited to
> > what is strictly needed.
>
> Yes, well my expectation is that other people are using skb_dump for
> debugging, even beyond those 2 callers in the mainline kernel. And when
> they want to dump with full_pkt=true, they really want to dump with
> full_pkt=true.

Sure, that makes sense.
David Miller Oct. 6, 2020, 1:14 p.m. UTC | #5
From: Vladimir Oltean <vladimir.oltean@nxp.com>
Date: Mon,  5 Oct 2020 17:48:38 +0300

> Currently skb_dump has a restriction to only dump full packet for the
> first 5 socket buffers, then only headers will be printed. Remove this
> arbitrary and confusing restriction, which is only documented vaguely
> ("up to") in the comments above the prototype.
> 
> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>

Applied, thank you.
diff mbox series

Patch

diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index e0774471f56d..720076a6e2b1 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -712,11 +712,10 @@  EXPORT_SYMBOL(kfree_skb_list);
  *
  * Must only be called from net_ratelimit()-ed paths.
  *
- * Dumps up to can_dump_full whole packets if full_pkt, headers otherwise.
+ * Dumps whole packets if full_pkt, only headers otherwise.
  */
 void skb_dump(const char *level, const struct sk_buff *skb, bool full_pkt)
 {
-	static atomic_t can_dump_full = ATOMIC_INIT(5);
 	struct skb_shared_info *sh = skb_shinfo(skb);
 	struct net_device *dev = skb->dev;
 	struct sock *sk = skb->sk;
@@ -725,9 +724,6 @@  void skb_dump(const char *level, const struct sk_buff *skb, bool full_pkt)
 	int headroom, tailroom;
 	int i, len, seg_len;
 
-	if (full_pkt)
-		full_pkt = atomic_dec_if_positive(&can_dump_full) >= 0;
-
 	if (full_pkt)
 		len = skb->len;
 	else