linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 net-next] net: drop_monitor: support drop reason
@ 2022-01-27  3:33 menglong8.dong
  2022-01-27 15:53 ` David Ahern
  0 siblings, 1 reply; 5+ messages in thread
From: menglong8.dong @ 2022-01-27  3:33 UTC (permalink / raw)
  To: kuba
  Cc: nhorman, davem, netdev, linux-kernel, dsahern, rostedt, Menglong Dong

From: Menglong Dong <imagedong@tencent.com>

In the commit c504e5c2f964 ("net: skb: introduce kfree_skb_reason()")
drop reason is introduced to the tracepoint of kfree_skb. Therefore,
drop_monitor is able to report the drop reason to users by netlink.

For now, the number of drop reason is passed to users ( seems it's
a little troublesome to pass the drop reason as string ). Therefore,
users can do some customized description of the reason.

Signed-off-by: Menglong Dong <imagedong@tencent.com>
---
v3:
- referring to cb->reason and cb->pc directly in
  net_dm_packet_report_fill()

v2:
- get a pointer to struct net_dm_skb_cb instead of local var for
  each field
---
 include/uapi/linux/net_dropmon.h |  1 +
 net/core/drop_monitor.c          | 16 ++++++++++++----
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/include/uapi/linux/net_dropmon.h b/include/uapi/linux/net_dropmon.h
index 66048cc5d7b3..b2815166dbc2 100644
--- a/include/uapi/linux/net_dropmon.h
+++ b/include/uapi/linux/net_dropmon.h
@@ -93,6 +93,7 @@ enum net_dm_attr {
 	NET_DM_ATTR_SW_DROPS,			/* flag */
 	NET_DM_ATTR_HW_DROPS,			/* flag */
 	NET_DM_ATTR_FLOW_ACTION_COOKIE,		/* binary */
+	NET_DM_ATTR_REASON,			/* u32 */
 
 	__NET_DM_ATTR_MAX,
 	NET_DM_ATTR_MAX = __NET_DM_ATTR_MAX - 1
diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
index 7b288a121a41..11448110f65d 100644
--- a/net/core/drop_monitor.c
+++ b/net/core/drop_monitor.c
@@ -126,6 +126,7 @@ struct net_dm_skb_cb {
 		struct devlink_trap_metadata *hw_metadata;
 		void *pc;
 	};
+	enum skb_drop_reason reason;
 };
 
 #define NET_DM_SKB_CB(__skb) ((struct net_dm_skb_cb *)&((__skb)->cb[0]))
@@ -498,6 +499,7 @@ static void net_dm_packet_trace_kfree_skb_hit(void *ignore,
 {
 	ktime_t tstamp = ktime_get_real();
 	struct per_cpu_dm_data *data;
+	struct net_dm_skb_cb *cb;
 	struct sk_buff *nskb;
 	unsigned long flags;
 
@@ -508,7 +510,9 @@ static void net_dm_packet_trace_kfree_skb_hit(void *ignore,
 	if (!nskb)
 		return;
 
-	NET_DM_SKB_CB(nskb)->pc = location;
+	cb = NET_DM_SKB_CB(nskb);
+	cb->reason = reason;
+	cb->pc = location;
 	/* Override the timestamp because we care about the time when the
 	 * packet was dropped.
 	 */
@@ -606,7 +610,7 @@ static int net_dm_packet_report_in_port_put(struct sk_buff *msg, int ifindex,
 static int net_dm_packet_report_fill(struct sk_buff *msg, struct sk_buff *skb,
 				     size_t payload_len)
 {
-	u64 pc = (u64)(uintptr_t) NET_DM_SKB_CB(skb)->pc;
+	struct net_dm_skb_cb *cb = NET_DM_SKB_CB(skb);
 	char buf[NET_DM_MAX_SYMBOL_LEN];
 	struct nlattr *attr;
 	void *hdr;
@@ -620,10 +624,14 @@ static int net_dm_packet_report_fill(struct sk_buff *msg, struct sk_buff *skb,
 	if (nla_put_u16(msg, NET_DM_ATTR_ORIGIN, NET_DM_ORIGIN_SW))
 		goto nla_put_failure;
 
-	if (nla_put_u64_64bit(msg, NET_DM_ATTR_PC, pc, NET_DM_ATTR_PAD))
+	if (nla_put_u64_64bit(msg, NET_DM_ATTR_PC, (u64)(uintptr_t)cb->pc,
+			      NET_DM_ATTR_PAD))
 		goto nla_put_failure;
 
-	snprintf(buf, sizeof(buf), "%pS", NET_DM_SKB_CB(skb)->pc);
+	if (nla_put_u32(msg, NET_DM_ATTR_REASON, cb->reason))
+		goto nla_put_failure;
+
+	snprintf(buf, sizeof(buf), "%pS", cb->pc);
 	if (nla_put_string(msg, NET_DM_ATTR_SYMBOL, buf))
 		goto nla_put_failure;
 
-- 
2.34.1


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

* Re: [PATCH v3 net-next] net: drop_monitor: support drop reason
  2022-01-27  3:33 [PATCH v3 net-next] net: drop_monitor: support drop reason menglong8.dong
@ 2022-01-27 15:53 ` David Ahern
  2022-01-27 16:02   ` Ido Schimmel
  0 siblings, 1 reply; 5+ messages in thread
From: David Ahern @ 2022-01-27 15:53 UTC (permalink / raw)
  To: menglong8.dong, kuba
  Cc: nhorman, davem, netdev, linux-kernel, dsahern, rostedt,
	Menglong Dong, Ido Schimmel

On 1/26/22 8:33 PM, menglong8.dong@gmail.com wrote:
> From: Menglong Dong <imagedong@tencent.com>
> 
> In the commit c504e5c2f964 ("net: skb: introduce kfree_skb_reason()")
> drop reason is introduced to the tracepoint of kfree_skb. Therefore,
> drop_monitor is able to report the drop reason to users by netlink.
> 
> For now, the number of drop reason is passed to users ( seems it's
> a little troublesome to pass the drop reason as string ). Therefore,
> users can do some customized description of the reason.
> 
> Signed-off-by: Menglong Dong <imagedong@tencent.com>
> ---
> v3:
> - referring to cb->reason and cb->pc directly in
>   net_dm_packet_report_fill()
> 
> v2:
> - get a pointer to struct net_dm_skb_cb instead of local var for
>   each field
> ---
>  include/uapi/linux/net_dropmon.h |  1 +
>  net/core/drop_monitor.c          | 16 ++++++++++++----
>  2 files changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/include/uapi/linux/net_dropmon.h b/include/uapi/linux/net_dropmon.h
> index 66048cc5d7b3..b2815166dbc2 100644
> --- a/include/uapi/linux/net_dropmon.h
> +++ b/include/uapi/linux/net_dropmon.h
> @@ -93,6 +93,7 @@ enum net_dm_attr {
>  	NET_DM_ATTR_SW_DROPS,			/* flag */
>  	NET_DM_ATTR_HW_DROPS,			/* flag */
>  	NET_DM_ATTR_FLOW_ACTION_COOKIE,		/* binary */
> +	NET_DM_ATTR_REASON,			/* u32 */
>  

For userspace to properly convert reason from id to string, enum
skb_drop_reason needs to be moved from skbuff.h to a uapi file.
include/uapi/linux/net_dropmon.h seems like the best candidate to me.
Maybe others have a better idea.


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

* Re: [PATCH v3 net-next] net: drop_monitor: support drop reason
  2022-01-27 15:53 ` David Ahern
@ 2022-01-27 16:02   ` Ido Schimmel
  2022-01-28  2:56     ` Menglong Dong
  2022-02-15  0:48     ` Cong Wang
  0 siblings, 2 replies; 5+ messages in thread
From: Ido Schimmel @ 2022-01-27 16:02 UTC (permalink / raw)
  To: David Ahern
  Cc: menglong8.dong, kuba, nhorman, davem, netdev, linux-kernel,
	dsahern, rostedt, Menglong Dong

On Thu, Jan 27, 2022 at 08:53:04AM -0700, David Ahern wrote:
> On 1/26/22 8:33 PM, menglong8.dong@gmail.com wrote:
> > From: Menglong Dong <imagedong@tencent.com>
> > 
> > In the commit c504e5c2f964 ("net: skb: introduce kfree_skb_reason()")
> > drop reason is introduced to the tracepoint of kfree_skb. Therefore,
> > drop_monitor is able to report the drop reason to users by netlink.
> > 
> > For now, the number of drop reason is passed to users ( seems it's
> > a little troublesome to pass the drop reason as string ). Therefore,
> > users can do some customized description of the reason.
> > 
> > Signed-off-by: Menglong Dong <imagedong@tencent.com>
> > ---
> > v3:
> > - referring to cb->reason and cb->pc directly in
> >   net_dm_packet_report_fill()
> > 
> > v2:
> > - get a pointer to struct net_dm_skb_cb instead of local var for
> >   each field
> > ---
> >  include/uapi/linux/net_dropmon.h |  1 +
> >  net/core/drop_monitor.c          | 16 ++++++++++++----
> >  2 files changed, 13 insertions(+), 4 deletions(-)
> > 
> > diff --git a/include/uapi/linux/net_dropmon.h b/include/uapi/linux/net_dropmon.h
> > index 66048cc5d7b3..b2815166dbc2 100644
> > --- a/include/uapi/linux/net_dropmon.h
> > +++ b/include/uapi/linux/net_dropmon.h
> > @@ -93,6 +93,7 @@ enum net_dm_attr {
> >  	NET_DM_ATTR_SW_DROPS,			/* flag */
> >  	NET_DM_ATTR_HW_DROPS,			/* flag */
> >  	NET_DM_ATTR_FLOW_ACTION_COOKIE,		/* binary */
> > +	NET_DM_ATTR_REASON,			/* u32 */
> >  
> 
> For userspace to properly convert reason from id to string, enum
> skb_drop_reason needs to be moved from skbuff.h to a uapi file.
> include/uapi/linux/net_dropmon.h seems like the best candidate to me.
> Maybe others have a better idea.

I think the best option would be to convert it to a string in the kernel
(or report both). Then you don't need to update user space tools such as
the Wireshark dissector [1] and DropWatch every time a new reason is
added.

[1] https://www.wireshark.org/docs/dfref/n/net_dm.html

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

* Re: [PATCH v3 net-next] net: drop_monitor: support drop reason
  2022-01-27 16:02   ` Ido Schimmel
@ 2022-01-28  2:56     ` Menglong Dong
  2022-02-15  0:48     ` Cong Wang
  1 sibling, 0 replies; 5+ messages in thread
From: Menglong Dong @ 2022-01-28  2:56 UTC (permalink / raw)
  To: Ido Schimmel
  Cc: David Ahern, Jakub Kicinski, Neil Horman, David Miller, netdev,
	LKML, David Ahern, Steven Rostedt, Menglong Dong

On Fri, Jan 28, 2022 at 12:03 AM Ido Schimmel <idosch@idosch.org> wrote:
>
> On Thu, Jan 27, 2022 at 08:53:04AM -0700, David Ahern wrote:
> > On 1/26/22 8:33 PM, menglong8.dong@gmail.com wrote:
> > > From: Menglong Dong <imagedong@tencent.com>
> > >
> > > In the commit c504e5c2f964 ("net: skb: introduce kfree_skb_reason()")
> > > drop reason is introduced to the tracepoint of kfree_skb. Therefore,
> > > drop_monitor is able to report the drop reason to users by netlink.
> > >
> > > For now, the number of drop reason is passed to users ( seems it's
> > > a little troublesome to pass the drop reason as string ). Therefore,
> > > users can do some customized description of the reason.
> > >
> > > Signed-off-by: Menglong Dong <imagedong@tencent.com>
> > > ---
> > > v3:
> > > - referring to cb->reason and cb->pc directly in
> > >   net_dm_packet_report_fill()
> > >
> > > v2:
> > > - get a pointer to struct net_dm_skb_cb instead of local var for
> > >   each field
> > > ---
> > >  include/uapi/linux/net_dropmon.h |  1 +
> > >  net/core/drop_monitor.c          | 16 ++++++++++++----
> > >  2 files changed, 13 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/include/uapi/linux/net_dropmon.h b/include/uapi/linux/net_dropmon.h
> > > index 66048cc5d7b3..b2815166dbc2 100644
> > > --- a/include/uapi/linux/net_dropmon.h
> > > +++ b/include/uapi/linux/net_dropmon.h
> > > @@ -93,6 +93,7 @@ enum net_dm_attr {
> > >     NET_DM_ATTR_SW_DROPS,                   /* flag */
> > >     NET_DM_ATTR_HW_DROPS,                   /* flag */
> > >     NET_DM_ATTR_FLOW_ACTION_COOKIE,         /* binary */
> > > +   NET_DM_ATTR_REASON,                     /* u32 */
> > >
> >
> > For userspace to properly convert reason from id to string, enum
> > skb_drop_reason needs to be moved from skbuff.h to a uapi file.
> > include/uapi/linux/net_dropmon.h seems like the best candidate to me.
> > Maybe others have a better idea.
>
> I think the best option would be to convert it to a string in the kernel
> (or report both). Then you don't need to update user space tools such as
> the Wireshark dissector [1] and DropWatch every time a new reason is
> added.

I think reporting it as a string would be a good choice. Is it ok if we do like
this (not tested yet)?

--- a/net/core/drop_monitor.c
+++ b/net/core/drop_monitor.c
@@ -48,6 +48,16 @@
 static int trace_state = TRACE_OFF;
 static bool monitor_hw;

+#undef EM
+#undef EMe
+
+#define EM(a, b) [a] = #b,
+#define EMe(a, b) [a] = #b
+
+static const char *drop_reasons[SKB_DROP_REASON_MAX + 1] = {
+       TRACE_SKB_DROP_REASON
+};
+
 /* net_dm_mutex
  *
  * An overall lock guarding every operation coming from userspace.
@@ -628,7 +638,8 @@ static int net_dm_packet_report_fill(struct
sk_buff *msg, struct sk_buff *skb,
                              NET_DM_ATTR_PAD))
                goto nla_put_failure;

-       if (nla_put_u32(msg, NET_DM_ATTR_REASON, cb->reason))
+       if (nla_put_string(msg, NET_DM_ATTR_REASON,
+                          drop_reasons[cb->reason]))
                goto nla_put_failure;

        snprintf(buf, sizeof(buf), "%pS", cb->pc);

Besides, I still think moving these reasons to uapi is necessary.
@David Ahern Is it ok to create a new file (such as net_skbuff.h)
for these reasons? Maybe other users need these enum in the
feature, and this job is done the sooner the better.

Thanks!
Menglong Dong

>
> [1] https://www.wireshark.org/docs/dfref/n/net_dm.html

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

* Re: [PATCH v3 net-next] net: drop_monitor: support drop reason
  2022-01-27 16:02   ` Ido Schimmel
  2022-01-28  2:56     ` Menglong Dong
@ 2022-02-15  0:48     ` Cong Wang
  1 sibling, 0 replies; 5+ messages in thread
From: Cong Wang @ 2022-02-15  0:48 UTC (permalink / raw)
  To: Ido Schimmel
  Cc: David Ahern, menglong8.dong, kuba, nhorman, davem, netdev,
	linux-kernel, dsahern, rostedt, Menglong Dong

On Thu, Jan 27, 2022 at 06:02:56PM +0200, Ido Schimmel wrote:
> On Thu, Jan 27, 2022 at 08:53:04AM -0700, David Ahern wrote:
> > On 1/26/22 8:33 PM, menglong8.dong@gmail.com wrote:
> > > From: Menglong Dong <imagedong@tencent.com>
> > > 
> > > In the commit c504e5c2f964 ("net: skb: introduce kfree_skb_reason()")
> > > drop reason is introduced to the tracepoint of kfree_skb. Therefore,
> > > drop_monitor is able to report the drop reason to users by netlink.
> > > 
> > > For now, the number of drop reason is passed to users ( seems it's
> > > a little troublesome to pass the drop reason as string ). Therefore,
> > > users can do some customized description of the reason.
> > > 
> > > Signed-off-by: Menglong Dong <imagedong@tencent.com>
> > > ---
> > > v3:
> > > - referring to cb->reason and cb->pc directly in
> > >   net_dm_packet_report_fill()
> > > 
> > > v2:
> > > - get a pointer to struct net_dm_skb_cb instead of local var for
> > >   each field
> > > ---
> > >  include/uapi/linux/net_dropmon.h |  1 +
> > >  net/core/drop_monitor.c          | 16 ++++++++++++----
> > >  2 files changed, 13 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/include/uapi/linux/net_dropmon.h b/include/uapi/linux/net_dropmon.h
> > > index 66048cc5d7b3..b2815166dbc2 100644
> > > --- a/include/uapi/linux/net_dropmon.h
> > > +++ b/include/uapi/linux/net_dropmon.h
> > > @@ -93,6 +93,7 @@ enum net_dm_attr {
> > >  	NET_DM_ATTR_SW_DROPS,			/* flag */
> > >  	NET_DM_ATTR_HW_DROPS,			/* flag */
> > >  	NET_DM_ATTR_FLOW_ACTION_COOKIE,		/* binary */
> > > +	NET_DM_ATTR_REASON,			/* u32 */
> > >  
> > 
> > For userspace to properly convert reason from id to string, enum
> > skb_drop_reason needs to be moved from skbuff.h to a uapi file.
> > include/uapi/linux/net_dropmon.h seems like the best candidate to me.
> > Maybe others have a better idea.
> 
> I think the best option would be to convert it to a string in the kernel

This is a bad idea. Integers are much better as they are more flexible
than strings, for example if your application wants to filter with a
specific reason, a simply integer comparison is much faster than a
string comparison. More importantly, user-space could store the integer
to string mapping by itself, saving strings in kernel is just
unnecessary.

> (or report both). Then you don't need to update user space tools such as
> the Wireshark dissector [1] and DropWatch every time a new reason is
> added.
> 
> [1] https://www.wireshark.org/docs/dfref/n/net_dm.html

I don't understand why this is even an argument, we have tons of
applications need to update to catch up with newer kernel...


Thanks.

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

end of thread, other threads:[~2022-02-15  0:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-27  3:33 [PATCH v3 net-next] net: drop_monitor: support drop reason menglong8.dong
2022-01-27 15:53 ` David Ahern
2022-01-27 16:02   ` Ido Schimmel
2022-01-28  2:56     ` Menglong Dong
2022-02-15  0:48     ` Cong Wang

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).