linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/2] net: snmp: tracepoint support for snmp
@ 2021-11-11 13:35 menglong8.dong
  2021-11-11 13:35 ` [PATCH net-next 1/2] net: snmp: add " menglong8.dong
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: menglong8.dong @ 2021-11-11 13:35 UTC (permalink / raw)
  To: kuba
  Cc: davem, rostedt, mingo, yoshfuji, dsahern, imagedong,
	linux-kernel, netdev

From: Menglong Dong <imagedong@tencent.com>

snmp is the network package statistics module in kernel, and it is
useful in network issue diagnosis, such as packet drop.

However, it is hard to get the detail information about the packet.
For example, we can know that there is something wrong with the
checksum of udp packet though 'InCsumErrors' of UDP protocol in
/proc/net/snmp, but we can't figure out the ip and port of the packet
that this error is happening on.

Add tracepoint for snmp. Therefor, users can use some tools (such as
eBPF) to get the information of the exceptional packet.

In the first patch, the frame of snmp-tracepoint is created. And in
the second patch, tracepoint for udp-snmp is introduced.


Menglong Dong (2):
  net: snmp: add tracepoint support for snmp
  net: snmp: add snmp tracepoint support for udp

 include/net/udp.h           | 25 ++++++++++++++-----
 include/trace/events/snmp.h | 50 +++++++++++++++++++++++++++++++++++++
 net/core/net-traces.c       |  3 +++
 net/ipv4/udp.c              | 28 +++++++++++++--------
 4 files changed, 89 insertions(+), 17 deletions(-)
 create mode 100644 include/trace/events/snmp.h

-- 
2.27.0


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

* [PATCH net-next 1/2] net: snmp: add tracepoint support for snmp
  2021-11-11 13:35 [PATCH net-next 0/2] net: snmp: tracepoint support for snmp menglong8.dong
@ 2021-11-11 13:35 ` menglong8.dong
  2021-11-16 21:34   ` Steven Rostedt
  2021-11-11 13:35 ` [PATCH net-next 2/2] net: snmp: add snmp tracepoint support for udp menglong8.dong
  2021-11-11 14:08 ` [PATCH net-next 0/2] net: snmp: tracepoint support for snmp Jakub Kicinski
  2 siblings, 1 reply; 13+ messages in thread
From: menglong8.dong @ 2021-11-11 13:35 UTC (permalink / raw)
  To: kuba
  Cc: davem, rostedt, mingo, yoshfuji, dsahern, imagedong,
	linux-kernel, netdev

From: Menglong Dong <imagedong@tencent.com>

snmp is the network package statistics module in kernel, and it is
useful in network issue diagnosis, such as packet drop.

However, it is hard to get the detail information about the packet.
For example, we can know that there is something wrong with the
checksum of udp packet though 'InCsumErrors' of UDP protocol in
/proc/net/snmp, but we can't figure out the ip and port of the packet
that this error is happening on.

Add tracepoint for snmp. Therefor, users can use some tools (such as
eBPF) to get the information of the exceptional packet.

Signed-off-by: Menglong Dong <imagedong@tencent.com>
---
 include/trace/events/snmp.h | 45 +++++++++++++++++++++++++++++++++++++
 net/core/net-traces.c       |  1 +
 2 files changed, 46 insertions(+)
 create mode 100644 include/trace/events/snmp.h

diff --git a/include/trace/events/snmp.h b/include/trace/events/snmp.h
new file mode 100644
index 000000000000..9dbd630306dd
--- /dev/null
+++ b/include/trace/events/snmp.h
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM snmp
+
+#if !defined(_TRACE_SNMP_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_SNMP_H
+
+#include <linux/tracepoint.h>
+#include <linux/skbuff.h>
+#include <linux/snmp.h>
+
+DECLARE_EVENT_CLASS(snmp_template,
+
+	TP_PROTO(struct sk_buff *skb, int field, int val),
+
+	TP_ARGS(skb, field, val),
+
+	TP_STRUCT__entry(
+		__field(void *, skbaddr)
+		__field(int, field)
+		__field(int, val)
+	),
+
+	TP_fast_assign(
+		__entry->skbaddr = skb;
+		__entry->field = field;
+		__entry->val = val;
+	),
+
+	TP_printk("skbaddr=%p, field=%d, val=%d", __entry->skbaddr,
+		  __entry->field, __entry->val)
+);
+
+#define DEFINE_SNMP_EVENT(proto)				\
+DEFINE_EVENT(snmp_template, snmp_##proto,			\
+	TP_PROTO(struct sk_buff *skb, int field, int val),	\
+	TP_ARGS(skb, field, val)				\
+)
+
+#define TRACE_SNMP(skb, proto, field, val) \
+	trace_snmp_##proto(skb, field, val)
+
+#endif
+
+#include <trace/define_trace.h>
diff --git a/net/core/net-traces.c b/net/core/net-traces.c
index c40cd8dd75c7..15ff40b83ca7 100644
--- a/net/core/net-traces.c
+++ b/net/core/net-traces.c
@@ -35,6 +35,7 @@
 #include <trace/events/tcp.h>
 #include <trace/events/fib.h>
 #include <trace/events/qdisc.h>
+#include <trace/events/snmp.h>
 #if IS_ENABLED(CONFIG_BRIDGE)
 #include <trace/events/bridge.h>
 EXPORT_TRACEPOINT_SYMBOL_GPL(br_fdb_add);
-- 
2.27.0


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

* [PATCH net-next 2/2] net: snmp: add snmp tracepoint support for udp
  2021-11-11 13:35 [PATCH net-next 0/2] net: snmp: tracepoint support for snmp menglong8.dong
  2021-11-11 13:35 ` [PATCH net-next 1/2] net: snmp: add " menglong8.dong
@ 2021-11-11 13:35 ` menglong8.dong
  2021-11-11 21:07   ` kernel test robot
  2021-11-13  3:32   ` kernel test robot
  2021-11-11 14:08 ` [PATCH net-next 0/2] net: snmp: tracepoint support for snmp Jakub Kicinski
  2 siblings, 2 replies; 13+ messages in thread
From: menglong8.dong @ 2021-11-11 13:35 UTC (permalink / raw)
  To: kuba
  Cc: davem, rostedt, mingo, yoshfuji, dsahern, imagedong,
	linux-kernel, netdev

From: Menglong Dong <imagedong@tencent.com>

Add snmp tracepoint support for udp. Here is the new tracepoint:
/sys/kernel/debug/tracing/events/snmp/snmp_udp/

Signed-off-by: Menglong Dong <imagedong@tencent.com>
---
 include/net/udp.h           | 25 +++++++++++++++++++------
 include/trace/events/snmp.h |  5 +++++
 net/core/net-traces.c       |  2 ++
 net/ipv4/udp.c              | 28 +++++++++++++++++-----------
 4 files changed, 43 insertions(+), 17 deletions(-)

diff --git a/include/net/udp.h b/include/net/udp.h
index 909ecf447e0f..bf39793f2052 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -28,6 +28,7 @@
 #include <linux/seq_file.h>
 #include <linux/poll.h>
 #include <linux/indirect_call_wrapper.h>
+#include <trace/events/snmp.h>
 
 /**
  *	struct udp_skb_cb  -  UDP(-Lite) private variables
@@ -408,12 +409,24 @@ static inline int copy_linear_skb(struct sk_buff *skb, int len, int off,
 /*
  * 	SNMP statistics for UDP and UDP-Lite
  */
-#define UDP_INC_STATS(net, field, is_udplite)		      do { \
-	if (is_udplite) SNMP_INC_STATS((net)->mib.udplite_statistics, field);       \
-	else		SNMP_INC_STATS((net)->mib.udp_statistics, field);  }  while(0)
-#define __UDP_INC_STATS(net, field, is_udplite) 	      do { \
-	if (is_udplite) __SNMP_INC_STATS((net)->mib.udplite_statistics, field);         \
-	else		__SNMP_INC_STATS((net)->mib.udp_statistics, field);    }  while(0)
+#define UDP_INC_STATS(net, field, is_udplite)			do {	\
+	if (is_udplite) {						\
+		SNMP_INC_STATS((net)->mib.udplite_statistics, field);	\
+		TRACE_SNMP(skb, udp, field, 1);				\
+	} else {							\
+		SNMP_INC_STATS((net)->mib.udp_statistics, field);	\
+		TRACE_SNMP(skb, udplite, field, 1);			\
+	}								\
+} while (0)
+#define __UDP_INC_STATS(net, skb, field, is_udplite)		do {	\
+	if (is_udplite) {						\
+		__SNMP_INC_STATS((net)->mib.udplite_statistics, field);	\
+		TRACE_SNMP(skb, udp, field, 1);				\
+	} else {							\
+		__SNMP_INC_STATS((net)->mib.udp_statistics, field);	\
+		TRACE_SNMP(skb, udplite, field, 1);			\
+	}								\
+}  while (0)
 
 #define __UDP6_INC_STATS(net, field, is_udplite)	    do { \
 	if (is_udplite) __SNMP_INC_STATS((net)->mib.udplite_stats_in6, field);\
diff --git a/include/trace/events/snmp.h b/include/trace/events/snmp.h
index 9dbd630306dd..799a8b66b438 100644
--- a/include/trace/events/snmp.h
+++ b/include/trace/events/snmp.h
@@ -37,6 +37,11 @@ DEFINE_EVENT(snmp_template, snmp_##proto,			\
 	TP_ARGS(skb, field, val)				\
 )
 
+
+
+DEFINE_SNMP_EVENT(udp);
+DEFINE_SNMP_EVENT(udplite);
+
 #define TRACE_SNMP(skb, proto, field, val) \
 	trace_snmp_##proto(skb, field, val)
 
diff --git a/net/core/net-traces.c b/net/core/net-traces.c
index 15ff40b83ca7..c33a86bb2db3 100644
--- a/net/core/net-traces.c
+++ b/net/core/net-traces.c
@@ -62,3 +62,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(napi_poll);
 
 EXPORT_TRACEPOINT_SYMBOL_GPL(tcp_send_reset);
 EXPORT_TRACEPOINT_SYMBOL_GPL(tcp_bad_csum);
+
+EXPORT_TRACEPOINT_SYMBOL_GPL(snmp_udp);
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 319dd7bbfe33..d5116971892f 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1648,9 +1648,11 @@ static struct sk_buff *__first_packet_length(struct sock *sk,
 
 	while ((skb = skb_peek(rcvq)) != NULL) {
 		if (udp_lib_checksum_complete(skb)) {
-			__UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS,
+			__UDP_INC_STATS(sock_net(sk), skb,
+					UDP_MIB_CSUMERRORS,
 					IS_UDPLITE(sk));
-			__UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS,
+			__UDP_INC_STATS(sock_net(sk), skb,
+					UDP_MIB_INERRORS,
 					IS_UDPLITE(sk));
 			atomic_inc(&sk->sk_drops);
 			__skb_unlink(skb, rcvq);
@@ -2143,7 +2145,7 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb)
 
 			ret = encap_rcv(sk, skb);
 			if (ret <= 0) {
-				__UDP_INC_STATS(sock_net(sk),
+				__UDP_INC_STATS(sock_net(sk), skb,
 						UDP_MIB_INDATAGRAMS,
 						is_udplite);
 				return -ret;
@@ -2201,9 +2203,10 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb)
 	return __udp_queue_rcv_skb(sk, skb);
 
 csum_error:
-	__UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS, is_udplite);
+	__UDP_INC_STATS(sock_net(sk), skb, UDP_MIB_CSUMERRORS,
+			is_udplite);
 drop:
-	__UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
+	__UDP_INC_STATS(sock_net(sk), skb, UDP_MIB_INERRORS, is_udplite);
 	atomic_inc(&sk->sk_drops);
 	kfree_skb(skb);
 	return -1;
@@ -2290,9 +2293,9 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
 
 		if (unlikely(!nskb)) {
 			atomic_inc(&sk->sk_drops);
-			__UDP_INC_STATS(net, UDP_MIB_RCVBUFERRORS,
+			__UDP_INC_STATS(net, skb, UDP_MIB_RCVBUFERRORS,
 					IS_UDPLITE(sk));
-			__UDP_INC_STATS(net, UDP_MIB_INERRORS,
+			__UDP_INC_STATS(net, skb, UDP_MIB_INERRORS,
 					IS_UDPLITE(sk));
 			continue;
 		}
@@ -2311,7 +2314,7 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
 			consume_skb(skb);
 	} else {
 		kfree_skb(skb);
-		__UDP_INC_STATS(net, UDP_MIB_IGNOREDMULTI,
+		__UDP_INC_STATS(net, skb, UDP_MIB_IGNOREDMULTI,
 				proto == IPPROTO_UDPLITE);
 	}
 	return 0;
@@ -2454,7 +2457,8 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
 	if (udp_lib_checksum_complete(skb))
 		goto csum_error;
 
-	__UDP_INC_STATS(net, UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE);
+	__UDP_INC_STATS(net, skb, UDP_MIB_NOPORTS,
+			proto == IPPROTO_UDPLITE);
 	icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
 
 	/*
@@ -2481,9 +2485,11 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
 			    proto == IPPROTO_UDPLITE ? "Lite" : "",
 			    &saddr, ntohs(uh->source), &daddr, ntohs(uh->dest),
 			    ulen);
-	__UDP_INC_STATS(net, UDP_MIB_CSUMERRORS, proto == IPPROTO_UDPLITE);
+	__UDP_INC_STATS(net, skb, UDP_MIB_CSUMERRORS,
+			proto == IPPROTO_UDPLITE);
 drop:
-	__UDP_INC_STATS(net, UDP_MIB_INERRORS, proto == IPPROTO_UDPLITE);
+	__UDP_INC_STATS(net, skb, UDP_MIB_INERRORS,
+			proto == IPPROTO_UDPLITE);
 	kfree_skb(skb);
 	return 0;
 }
-- 
2.27.0


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

* Re: [PATCH net-next 0/2] net: snmp: tracepoint support for snmp
  2021-11-11 13:35 [PATCH net-next 0/2] net: snmp: tracepoint support for snmp menglong8.dong
  2021-11-11 13:35 ` [PATCH net-next 1/2] net: snmp: add " menglong8.dong
  2021-11-11 13:35 ` [PATCH net-next 2/2] net: snmp: add snmp tracepoint support for udp menglong8.dong
@ 2021-11-11 14:08 ` Jakub Kicinski
  2021-11-12  1:40   ` Menglong Dong
  2 siblings, 1 reply; 13+ messages in thread
From: Jakub Kicinski @ 2021-11-11 14:08 UTC (permalink / raw)
  To: menglong8.dong
  Cc: davem, rostedt, mingo, yoshfuji, dsahern, imagedong,
	linux-kernel, netdev

On Thu, 11 Nov 2021 21:35:28 +0800 menglong8.dong@gmail.com wrote:
> From: Menglong Dong <imagedong@tencent.com>
> 
> snmp is the network package statistics module in kernel, and it is
> useful in network issue diagnosis, such as packet drop.
> 
> However, it is hard to get the detail information about the packet.
> For example, we can know that there is something wrong with the
> checksum of udp packet though 'InCsumErrors' of UDP protocol in
> /proc/net/snmp, but we can't figure out the ip and port of the packet
> that this error is happening on.
> 
> Add tracepoint for snmp. Therefor, users can use some tools (such as
> eBPF) to get the information of the exceptional packet.
> 
> In the first patch, the frame of snmp-tracepoint is created. And in
> the second patch, tracepoint for udp-snmp is introduced.

I feel like I have seen this idea before. Is this your first posting?

Would you mind including links to previous discussion if you're aware
of any?

Regardless:


# Form letter - net-next is closed

We have already sent the networking pull request for 5.16
and therefore net-next is closed for new drivers, features,
code refactoring and optimizations. We are currently accepting
bug fixes only.

Please repost when net-next reopens after 5.16-rc1 is cut.

Look out for the announcement on the mailing list or check:
http://vger.kernel.org/~davem/net-next.html

RFC patches sent for review only are obviously welcome at any time.

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

* Re: [PATCH net-next 2/2] net: snmp: add snmp tracepoint support for udp
  2021-11-11 13:35 ` [PATCH net-next 2/2] net: snmp: add snmp tracepoint support for udp menglong8.dong
@ 2021-11-11 21:07   ` kernel test robot
  2021-11-13  3:32   ` kernel test robot
  1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2021-11-11 21:07 UTC (permalink / raw)
  To: menglong8.dong, kuba
  Cc: kbuild-all, davem, rostedt, mingo, yoshfuji, dsahern, imagedong,
	linux-kernel, netdev

[-- Attachment #1: Type: text/plain, Size: 15002 bytes --]

Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on net-next/master]

url:    https://github.com/0day-ci/linux/commits/menglong8-dong-gmail-com/net-snmp-tracepoint-support-for-snmp/20211111-213642
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 84882cf72cd774cf16fd338bdbf00f69ac9f9194
config: i386-allyesconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # https://github.com/0day-ci/linux/commit/15def40653e2754aa06d5af35d8fccd51ea903d2
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review menglong8-dong-gmail-com/net-snmp-tracepoint-support-for-snmp/20211111-213642
        git checkout 15def40653e2754aa06d5af35d8fccd51ea903d2
        # save the attached .config to linux build tree
        mkdir build_dir
        make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.c:5:
   drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h:25:43: error: expected ')' before 'const'
      25 | DECLARE_EVENT_CLASS(mlx5e_flower_template,
         |                                           ^
         |                                           )
   drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h:48:60: error: expected ')' before 'const'
      48 | DEFINE_EVENT(mlx5e_flower_template, mlx5e_configure_flower,
         |                                                            ^
         |                                                            )
   drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h:53:57: error: expected ')' before 'const'
      53 | DEFINE_EVENT(mlx5e_flower_template, mlx5e_delete_flower,
         |                                                         ^
         |                                                         )
   drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h:58:32: error: expected ')' before 'const'
      58 | TRACE_EVENT(mlx5e_stats_flower,
         |                                ^
         |                                )
   drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h:77:46: error: expected ')' before 'const'
      77 | TRACE_EVENT(mlx5e_tc_update_neigh_used_value,
         |                                              ^
         |                                              )
   In file included from include/trace/define_trace.h:95,
                    from drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h:114,
                    from drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.c:5:
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h:25:43: error: expected ')' before 'const'
      25 | DECLARE_EVENT_CLASS(mlx5e_flower_template,
         |                                           ^
         |                                           )
   In file included from <command-line>:
>> include/linux/static_call_types.h:15:34: error: '__SCT__tp_func_mlx5e_configure_flower' undeclared here (not in a function); did you mean '__SCK__tp_func_mlx5e_configure_flower'?
      15 | #define STATIC_CALL_TRAMP_PREFIX __SCT__
         |                                  ^~~~~~~
   include/linux/compiler_types.h:59:23: note: in definition of macro '___PASTE'
      59 | #define ___PASTE(a,b) a##b
         |                       ^
   include/linux/static_call_types.h:18:34: note: in expansion of macro '__PASTE'
      18 | #define STATIC_CALL_TRAMP(name)  __PASTE(STATIC_CALL_TRAMP_PREFIX, name)
         |                                  ^~~~~~~
   include/linux/static_call_types.h:18:42: note: in expansion of macro 'STATIC_CALL_TRAMP_PREFIX'
      18 | #define STATIC_CALL_TRAMP(name)  __PASTE(STATIC_CALL_TRAMP_PREFIX, name)
         |                                          ^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/static_call.h:146:39: note: in expansion of macro 'STATIC_CALL_TRAMP'
     146 | #define STATIC_CALL_TRAMP_ADDR(name) &STATIC_CALL_TRAMP(name)
         |                                       ^~~~~~~~~~~~~~~~~
   include/linux/tracepoint.h:303:24: note: in expansion of macro 'STATIC_CALL_TRAMP_ADDR'
     303 |   .static_call_tramp = STATIC_CALL_TRAMP_ADDR(tp_func_##_name), \
         |                        ^~~~~~~~~~~~~~~~~~~~~~
   include/linux/tracepoint.h:328:2: note: in expansion of macro 'DEFINE_TRACE_FN'
     328 |  DEFINE_TRACE_FN(name, NULL, NULL, PARAMS(proto), PARAMS(args));
         |  ^~~~~~~~~~~~~~~
   include/trace/define_trace.h:57:2: note: in expansion of macro 'DEFINE_TRACE'
      57 |  DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
         |  ^~~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h:48:1: note: in expansion of macro 'DEFINE_EVENT'
      48 | DEFINE_EVENT(mlx5e_flower_template, mlx5e_configure_flower,
         | ^~~~~~~~~~~~
>> include/linux/static_call_types.h:15:34: error: '__SCT__tp_func_mlx5e_delete_flower' undeclared here (not in a function); did you mean '__SCK__tp_func_mlx5e_delete_flower'?
      15 | #define STATIC_CALL_TRAMP_PREFIX __SCT__
         |                                  ^~~~~~~
   include/linux/compiler_types.h:59:23: note: in definition of macro '___PASTE'
      59 | #define ___PASTE(a,b) a##b
         |                       ^
   include/linux/static_call_types.h:18:34: note: in expansion of macro '__PASTE'
      18 | #define STATIC_CALL_TRAMP(name)  __PASTE(STATIC_CALL_TRAMP_PREFIX, name)
         |                                  ^~~~~~~
   include/linux/static_call_types.h:18:42: note: in expansion of macro 'STATIC_CALL_TRAMP_PREFIX'
      18 | #define STATIC_CALL_TRAMP(name)  __PASTE(STATIC_CALL_TRAMP_PREFIX, name)
         |                                          ^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/static_call.h:146:39: note: in expansion of macro 'STATIC_CALL_TRAMP'
     146 | #define STATIC_CALL_TRAMP_ADDR(name) &STATIC_CALL_TRAMP(name)
         |                                       ^~~~~~~~~~~~~~~~~
   include/linux/tracepoint.h:303:24: note: in expansion of macro 'STATIC_CALL_TRAMP_ADDR'
     303 |   .static_call_tramp = STATIC_CALL_TRAMP_ADDR(tp_func_##_name), \
         |                        ^~~~~~~~~~~~~~~~~~~~~~
   include/linux/tracepoint.h:328:2: note: in expansion of macro 'DEFINE_TRACE_FN'
     328 |  DEFINE_TRACE_FN(name, NULL, NULL, PARAMS(proto), PARAMS(args));
         |  ^~~~~~~~~~~~~~~
   include/trace/define_trace.h:57:2: note: in expansion of macro 'DEFINE_TRACE'
      57 |  DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
         |  ^~~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h:53:1: note: in expansion of macro 'DEFINE_EVENT'
      53 | DEFINE_EVENT(mlx5e_flower_template, mlx5e_delete_flower,
         | ^~~~~~~~~~~~
>> include/linux/static_call_types.h:15:34: error: '__SCT__tp_func_mlx5e_stats_flower' undeclared here (not in a function); did you mean '__SCK__tp_func_mlx5e_stats_flower'?
      15 | #define STATIC_CALL_TRAMP_PREFIX __SCT__
         |                                  ^~~~~~~
   include/linux/compiler_types.h:59:23: note: in definition of macro '___PASTE'
      59 | #define ___PASTE(a,b) a##b
         |                       ^
   include/linux/static_call_types.h:18:34: note: in expansion of macro '__PASTE'
      18 | #define STATIC_CALL_TRAMP(name)  __PASTE(STATIC_CALL_TRAMP_PREFIX, name)
         |                                  ^~~~~~~
   include/linux/static_call_types.h:18:42: note: in expansion of macro 'STATIC_CALL_TRAMP_PREFIX'
      18 | #define STATIC_CALL_TRAMP(name)  __PASTE(STATIC_CALL_TRAMP_PREFIX, name)
         |                                          ^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/static_call.h:146:39: note: in expansion of macro 'STATIC_CALL_TRAMP'
     146 | #define STATIC_CALL_TRAMP_ADDR(name) &STATIC_CALL_TRAMP(name)
         |                                       ^~~~~~~~~~~~~~~~~
   include/linux/tracepoint.h:303:24: note: in expansion of macro 'STATIC_CALL_TRAMP_ADDR'
     303 |   .static_call_tramp = STATIC_CALL_TRAMP_ADDR(tp_func_##_name), \
         |                        ^~~~~~~~~~~~~~~~~~~~~~
   include/linux/tracepoint.h:328:2: note: in expansion of macro 'DEFINE_TRACE_FN'
     328 |  DEFINE_TRACE_FN(name, NULL, NULL, PARAMS(proto), PARAMS(args));
         |  ^~~~~~~~~~~~~~~
   include/trace/define_trace.h:28:2: note: in expansion of macro 'DEFINE_TRACE'
      28 |  DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
         |  ^~~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h:58:1: note: in expansion of macro 'TRACE_EVENT'
      58 | TRACE_EVENT(mlx5e_stats_flower,
         | ^~~~~~~~~~~
>> include/linux/static_call_types.h:15:34: error: '__SCT__tp_func_mlx5e_tc_update_neigh_used_value' undeclared here (not in a function); did you mean '__SCK__tp_func_mlx5e_tc_update_neigh_used_value'?
      15 | #define STATIC_CALL_TRAMP_PREFIX __SCT__
         |                                  ^~~~~~~
   include/linux/compiler_types.h:59:23: note: in definition of macro '___PASTE'
      59 | #define ___PASTE(a,b) a##b
         |                       ^
   include/linux/static_call_types.h:18:34: note: in expansion of macro '__PASTE'
      18 | #define STATIC_CALL_TRAMP(name)  __PASTE(STATIC_CALL_TRAMP_PREFIX, name)
         |                                  ^~~~~~~
   include/linux/static_call_types.h:18:42: note: in expansion of macro 'STATIC_CALL_TRAMP_PREFIX'
      18 | #define STATIC_CALL_TRAMP(name)  __PASTE(STATIC_CALL_TRAMP_PREFIX, name)
         |                                          ^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/static_call.h:146:39: note: in expansion of macro 'STATIC_CALL_TRAMP'
     146 | #define STATIC_CALL_TRAMP_ADDR(name) &STATIC_CALL_TRAMP(name)
         |                                       ^~~~~~~~~~~~~~~~~
   include/linux/tracepoint.h:303:24: note: in expansion of macro 'STATIC_CALL_TRAMP_ADDR'
     303 |   .static_call_tramp = STATIC_CALL_TRAMP_ADDR(tp_func_##_name), \
         |                        ^~~~~~~~~~~~~~~~~~~~~~
   include/linux/tracepoint.h:328:2: note: in expansion of macro 'DEFINE_TRACE_FN'
     328 |  DEFINE_TRACE_FN(name, NULL, NULL, PARAMS(proto), PARAMS(args));
         |  ^~~~~~~~~~~~~~~
   include/trace/define_trace.h:28:2: note: in expansion of macro 'DEFINE_TRACE'
      28 |  DEFINE_TRACE(name, PARAMS(proto), PARAMS(args))
         |  ^~~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h:77:1: note: in expansion of macro 'TRACE_EVENT'
      77 | TRACE_EVENT(mlx5e_tc_update_neigh_used_value,
         | ^~~~~~~~~~~
   In file included from include/trace/define_trace.h:102,
                    from drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h:114,
                    from drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.c:5:
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h: In function 'ftrace_test_probe_mlx5e_configure_flower':
   include/trace/trace_events.h:757:2: error: implicit declaration of function 'check_trace_callback_type_mlx5e_configure_flower' [-Werror=implicit-function-declaration]
     757 |  check_trace_callback_type_##call(trace_event_raw_event_##template); \
         |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h:48:1: note: in expansion of macro 'DEFINE_EVENT'
      48 | DEFINE_EVENT(mlx5e_flower_template, mlx5e_configure_flower,
         | ^~~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h: In function 'ftrace_test_probe_mlx5e_delete_flower':
   include/trace/trace_events.h:757:2: error: implicit declaration of function 'check_trace_callback_type_mlx5e_delete_flower'; did you mean 'check_trace_callback_type_snmp_udplite'? [-Werror=implicit-function-declaration]
     757 |  check_trace_callback_type_##call(trace_event_raw_event_##template); \
         |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h:53:1: note: in expansion of macro 'DEFINE_EVENT'
      53 | DEFINE_EVENT(mlx5e_flower_template, mlx5e_delete_flower,
         | ^~~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h: In function 'ftrace_test_probe_mlx5e_stats_flower':
   include/trace/trace_events.h:757:2: error: implicit declaration of function 'check_trace_callback_type_mlx5e_stats_flower'; did you mean 'check_trace_callback_type_snmp_udplite'? [-Werror=implicit-function-declaration]
     757 |  check_trace_callback_type_##call(trace_event_raw_event_##template); \
         |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/trace/trace_events.h:81:2: note: in expansion of macro 'DEFINE_EVENT'
      81 |  DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args));
         |  ^~~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h:58:1: note: in expansion of macro 'TRACE_EVENT'
      58 | TRACE_EVENT(mlx5e_stats_flower,
         | ^~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h: In function 'ftrace_test_probe_mlx5e_tc_update_neigh_used_value':
   include/trace/trace_events.h:757:2: error: implicit declaration of function 'check_trace_callback_type_mlx5e_tc_update_neigh_used_value'; did you mean 'trace_raw_output_mlx5e_tc_update_neigh_used_value'? [-Werror=implicit-function-declaration]
     757 |  check_trace_callback_type_##call(trace_event_raw_event_##template); \
         |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
   include/trace/trace_events.h:81:2: note: in expansion of macro 'DEFINE_EVENT'
      81 |  DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args));
         |  ^~~~~~~~~~~~
   drivers/net/ethernet/mellanox/mlx5/core/./diag/en_tc_tracepoint.h:77:1: note: in expansion of macro 'TRACE_EVENT'
      77 | TRACE_EVENT(mlx5e_tc_update_neigh_used_value,
         | ^~~~~~~~~~~
   cc1: all warnings being treated as errors


vim +15 include/linux/static_call_types.h

115284d89a436e9 Josh Poimboeuf 2020-08-18  14  
115284d89a436e9 Josh Poimboeuf 2020-08-18 @15  #define STATIC_CALL_TRAMP_PREFIX	__SCT__
115284d89a436e9 Josh Poimboeuf 2020-08-18  16  #define STATIC_CALL_TRAMP_PREFIX_STR	__stringify(STATIC_CALL_TRAMP_PREFIX)
9183c3f9ed710a8 Josh Poimboeuf 2020-08-18  17  #define STATIC_CALL_TRAMP_PREFIX_LEN	(sizeof(STATIC_CALL_TRAMP_PREFIX_STR) - 1)
115284d89a436e9 Josh Poimboeuf 2020-08-18  18  #define STATIC_CALL_TRAMP(name)		__PASTE(STATIC_CALL_TRAMP_PREFIX, name)
115284d89a436e9 Josh Poimboeuf 2020-08-18  19  #define STATIC_CALL_TRAMP_STR(name)	__stringify(STATIC_CALL_TRAMP(name))
115284d89a436e9 Josh Poimboeuf 2020-08-18  20  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 66058 bytes --]

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

* Re: [PATCH net-next 0/2] net: snmp: tracepoint support for snmp
  2021-11-11 14:08 ` [PATCH net-next 0/2] net: snmp: tracepoint support for snmp Jakub Kicinski
@ 2021-11-12  1:40   ` Menglong Dong
  2021-11-12  1:50     ` Jakub Kicinski
  0 siblings, 1 reply; 13+ messages in thread
From: Menglong Dong @ 2021-11-12  1:40 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: David Miller, Steven Rostedt, mingo, Hideaki YOSHIFUJI, dsahern,
	Menglong Dong, LKML, netdev

Hello,

On Thu, Nov 11, 2021 at 10:08 PM Jakub Kicinski <kuba@kernel.org> wrote:
>
[...]
>
> I feel like I have seen this idea before. Is this your first posting?
>
> Would you mind including links to previous discussion if you're aware
> of any?

This is the first time that I post this patch. Do you mean that someone
else has done this before? Sorry, I didn't find it~

>
> Regardless:
>
>
> # Form letter - net-next is closed
>
> We have already sent the networking pull request for 5.16
> and therefore net-next is closed for new drivers, features,
> code refactoring and optimizations. We are currently accepting
> bug fixes only.
>
> Please repost when net-next reopens after 5.16-rc1 is cut.
>

Ok, I'll repost it later. By the way, is this idea acceptable? In fact,
I also introduced the snmp-tracepoint for ICMP, TCP and IP.

Thanks!
Menglong Dong

> Look out for the announcement on the mailing list or check:
> http://vger.kernel.org/~davem/net-next.html
>
> RFC patches sent for review only are obviously welcome at any time.

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

* Re: [PATCH net-next 0/2] net: snmp: tracepoint support for snmp
  2021-11-12  1:40   ` Menglong Dong
@ 2021-11-12  1:50     ` Jakub Kicinski
  2021-11-12  6:42       ` Menglong Dong
  0 siblings, 1 reply; 13+ messages in thread
From: Jakub Kicinski @ 2021-11-12  1:50 UTC (permalink / raw)
  To: Menglong Dong
  Cc: David Miller, Steven Rostedt, mingo, Hideaki YOSHIFUJI, dsahern,
	Menglong Dong, LKML, netdev

On Fri, 12 Nov 2021 09:40:47 +0800 Menglong Dong wrote:
> > I feel like I have seen this idea before. Is this your first posting?
> >
> > Would you mind including links to previous discussion if you're aware
> > of any?  
> 
> This is the first time that I post this patch. Do you mean that someone
> else has done this before? Sorry, I didn't find it~

I see. Yes, I believe very similar changes were proposed in the past.

I believe that concerns about the performance impact had prevented them
from being merged.

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

* Re: [PATCH net-next 0/2] net: snmp: tracepoint support for snmp
  2021-11-12  1:50     ` Jakub Kicinski
@ 2021-11-12  6:42       ` Menglong Dong
  2021-11-12 14:31         ` Steven Rostedt
  0 siblings, 1 reply; 13+ messages in thread
From: Menglong Dong @ 2021-11-12  6:42 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: David Miller, Steven Rostedt, mingo, Hideaki YOSHIFUJI, dsahern,
	Menglong Dong, LKML, netdev

Hello,

On Fri, Nov 12, 2021 at 9:50 AM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Fri, 12 Nov 2021 09:40:47 +0800 Menglong Dong wrote:
> > > I feel like I have seen this idea before. Is this your first posting?
> > >
> > > Would you mind including links to previous discussion if you're aware
> > > of any?
> >
> > This is the first time that I post this patch. Do you mean that someone
> > else has done this before? Sorry, I didn't find it~
>
> I see. Yes, I believe very similar changes were proposed in the past.
>
> I believe that concerns about the performance impact had prevented them
> from being merged.

I have found a similar post:
https://lore.kernel.org/netdev/20090303165747.GA1480@hmsreliant.think-freely.org/

And this is the tracepoint for kfree_skb().

I also concerns about the performance. However, with the tracepoints disabled,
they don't have any impact; with enabled, their impact is no more than the
tracepoint in kfree_skb() and consume_skb().

What's more, I have also realized another version: create tracepoint for every
statistics type, such as snmp_udp_incsumerrors, snmp_udp_rcvbuferrors, etc.
This can solve performance issue, as users can enable part of them, which
may be triggered not frequently. However, too many tracepoint are created, and
I think it may be not applicable.

Thanks!
Menglong Dong

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

* Re: [PATCH net-next 0/2] net: snmp: tracepoint support for snmp
  2021-11-12  6:42       ` Menglong Dong
@ 2021-11-12 14:31         ` Steven Rostedt
  2021-11-16  2:27           ` Menglong Dong
  0 siblings, 1 reply; 13+ messages in thread
From: Steven Rostedt @ 2021-11-12 14:31 UTC (permalink / raw)
  To: Menglong Dong
  Cc: Jakub Kicinski, David Miller, mingo, Hideaki YOSHIFUJI, dsahern,
	Menglong Dong, LKML, netdev

On Fri, 12 Nov 2021 14:42:23 +0800
Menglong Dong <menglong8.dong@gmail.com> wrote:

> What's more, I have also realized another version: create tracepoint for every
> statistics type, such as snmp_udp_incsumerrors, snmp_udp_rcvbuferrors, etc.
> This can solve performance issue, as users can enable part of them, which
> may be triggered not frequently. However, too many tracepoint are created, and
> I think it may be not applicable.

If possible, it would be great to have a single tracepoint to handle all
statistics (not sure what data it will be having). Or at least break it
down to one tracepoint per group of statistics.

There's two approaches that can be taken.

1) Create a DECLARE_EVENT_CLASS() template that the group of tracepoints
use, and then create a DEFINE_EVENT() for each one. This will create a
separate trace event for each stat. Most the footprint of a trace event is
in the CLASS portion, so having a single class helps keep the size overhead
down.

2) Just use a single trace event for all stats in a group, but perhaps have
a type field for each to use. That way it can be easy to filter on a set of
stats to trace.

-- Steve

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

* Re: [PATCH net-next 2/2] net: snmp: add snmp tracepoint support for udp
  2021-11-11 13:35 ` [PATCH net-next 2/2] net: snmp: add snmp tracepoint support for udp menglong8.dong
  2021-11-11 21:07   ` kernel test robot
@ 2021-11-13  3:32   ` kernel test robot
  1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2021-11-13  3:32 UTC (permalink / raw)
  To: menglong8.dong, kuba
  Cc: kbuild-all, davem, rostedt, mingo, yoshfuji, dsahern, imagedong,
	linux-kernel, netdev

[-- Attachment #1: Type: text/plain, Size: 9127 bytes --]

Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on net-next/master]

url:    https://github.com/0day-ci/linux/commits/menglong8-dong-gmail-com/net-snmp-tracepoint-support-for-snmp/20211111-213642
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 84882cf72cd774cf16fd338bdbf00f69ac9f9194
config: m68k-allmodconfig (attached as .config)
compiler: m68k-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/15def40653e2754aa06d5af35d8fccd51ea903d2
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review menglong8-dong-gmail-com/net-snmp-tracepoint-support-for-snmp/20211111-213642
        git checkout 15def40653e2754aa06d5af35d8fccd51ea903d2
        # save the attached .config to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=m68k SHELL=/bin/bash net/ipv6/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   net/ipv6/udp.c: In function 'udpv6_queue_rcv_one_skb':
>> net/ipv6/udp.c:705:59: error: macro "__UDP_INC_STATS" requires 4 arguments, but only 3 given
     705 |                                                 is_udplite);
         |                                                           ^
   In file included from net/ipv6/udp_impl.h:4,
                    from net/ipv6/udp.c:55:
   include/net/udp.h:421: note: macro "__UDP_INC_STATS" defined here
     421 | #define __UDP_INC_STATS(net, skb, field, is_udplite)            do {    \
         | 
>> net/ipv6/udp.c:703:33: error: '__UDP_INC_STATS' undeclared (first use in this function); did you mean 'UDP_INC_STATS'?
     703 |                                 __UDP_INC_STATS(sock_net(sk),
         |                                 ^~~~~~~~~~~~~~~
         |                                 UDP_INC_STATS
   net/ipv6/udp.c:703:33: note: each undeclared identifier is reported only once for each function it appears in


vim +/__UDP_INC_STATS +705 net/ipv6/udp.c

ba4e58eca8aa94 Gerrit Renker        2006-11-27  669  
cf329aa42b6659 Paolo Abeni          2018-11-07  670  static int udpv6_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb)
ba4e58eca8aa94 Gerrit Renker        2006-11-27  671  {
ba4e58eca8aa94 Gerrit Renker        2006-11-27  672  	struct udp_sock *up = udp_sk(sk);
b2bf1e2659b1cb Wang Chen            2007-12-03  673  	int is_udplite = IS_UDPLITE(sk);
a18135eb9389c2 David S. Miller      2006-08-15  674  
ba4e58eca8aa94 Gerrit Renker        2006-11-27  675  	if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
ba4e58eca8aa94 Gerrit Renker        2006-11-27  676  		goto drop;
^1da177e4c3f41 Linus Torvalds       2005-04-16  677  
88ab31081b8c8d Davidlohr Bueso      2018-05-08  678  	if (static_branch_unlikely(&udpv6_encap_needed_key) && up->encap_type) {
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  679  		int (*encap_rcv)(struct sock *sk, struct sk_buff *skb);
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  680  
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  681  		/*
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  682  		 * This is an encapsulation socket so pass the skb to
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  683  		 * the socket's udp_encap_rcv() hook. Otherwise, just
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  684  		 * fall through and pass this up the UDP socket.
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  685  		 * up->encap_rcv() returns the following value:
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  686  		 * =0 if skb was successfully passed to the encap
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  687  		 *    handler or was discarded by it.
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  688  		 * >0 if skb should be passed on to UDP.
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  689  		 * <0 if skb should be resubmitted as proto -N
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  690  		 */
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  691  
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  692  		/* if we're overly short, let UDP handle it */
6aa7de059173a9 Mark Rutland         2017-10-23  693  		encap_rcv = READ_ONCE(up->encap_rcv);
e5aed006be918a Hannes Frederic Sowa 2016-05-19  694  		if (encap_rcv) {
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  695  			int ret;
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  696  
0a80966b1043c3 Tom Herbert          2014-05-07  697  			/* Verify checksum before giving to encap */
0a80966b1043c3 Tom Herbert          2014-05-07  698  			if (udp_lib_checksum_complete(skb))
0a80966b1043c3 Tom Herbert          2014-05-07  699  				goto csum_error;
0a80966b1043c3 Tom Herbert          2014-05-07  700  
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  701  			ret = encap_rcv(sk, skb);
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  702  			if (ret <= 0) {
02c223470c3cc3 Eric Dumazet         2016-04-27 @703  				__UDP_INC_STATS(sock_net(sk),
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  704  						UDP_MIB_INDATAGRAMS,
d7f3f62167bc22 Benjamin LaHaise     2012-04-27 @705  						is_udplite);
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  706  				return -ret;
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  707  			}
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  708  		}
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  709  
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  710  		/* FALLTHROUGH -- it's a UDP Packet */
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  711  	}
d7f3f62167bc22 Benjamin LaHaise     2012-04-27  712  
ba4e58eca8aa94 Gerrit Renker        2006-11-27  713  	/*
ba4e58eca8aa94 Gerrit Renker        2006-11-27  714  	 * UDP-Lite specific tests, ignored on UDP sockets (see net/ipv4/udp.c).
ba4e58eca8aa94 Gerrit Renker        2006-11-27  715  	 */
b0a422772fec29 Miaohe Lin           2020-07-21  716  	if ((up->pcflag & UDPLITE_RECV_CC)  &&  UDP_SKB_CB(skb)->partial_cov) {
ba4e58eca8aa94 Gerrit Renker        2006-11-27  717  
ba4e58eca8aa94 Gerrit Renker        2006-11-27  718  		if (up->pcrlen == 0) {          /* full coverage was set  */
ba7a46f16dd29f Joe Perches          2014-11-11  719  			net_dbg_ratelimited("UDPLITE6: partial coverage %d while full coverage %d requested\n",
ba4e58eca8aa94 Gerrit Renker        2006-11-27  720  					    UDP_SKB_CB(skb)->cscov, skb->len);
ba4e58eca8aa94 Gerrit Renker        2006-11-27  721  			goto drop;
^1da177e4c3f41 Linus Torvalds       2005-04-16  722  		}
ba4e58eca8aa94 Gerrit Renker        2006-11-27  723  		if (UDP_SKB_CB(skb)->cscov  <  up->pcrlen) {
ba7a46f16dd29f Joe Perches          2014-11-11  724  			net_dbg_ratelimited("UDPLITE6: coverage %d too small, need min %d\n",
ba4e58eca8aa94 Gerrit Renker        2006-11-27  725  					    UDP_SKB_CB(skb)->cscov, up->pcrlen);
ba4e58eca8aa94 Gerrit Renker        2006-11-27  726  			goto drop;
ba4e58eca8aa94 Gerrit Renker        2006-11-27  727  		}
ba4e58eca8aa94 Gerrit Renker        2006-11-27  728  	}
ba4e58eca8aa94 Gerrit Renker        2006-11-27  729  
4b943faedfc29e Paolo Abeni          2017-06-22  730  	prefetch(&sk->sk_rmem_alloc);
ce25d66ad5f8d9 Eric Dumazet         2016-06-02  731  	if (rcu_access_pointer(sk->sk_filter) &&
ce25d66ad5f8d9 Eric Dumazet         2016-06-02  732  	    udp_lib_checksum_complete(skb))
6a5dc9e598fe90 Eric Dumazet         2013-04-29  733  		goto csum_error;
ce25d66ad5f8d9 Eric Dumazet         2016-06-02  734  
ba66bbe5480a01 Daniel Borkmann      2016-07-25  735  	if (sk_filter_trim_cap(sk, skb, sizeof(struct udphdr)))
a612769774a30e Michal Kubeček       2016-07-08  736  		goto drop;
^1da177e4c3f41 Linus Torvalds       2005-04-16  737  
e6afc8ace6dd5c samanthakumar        2016-04-05  738  	udp_csum_pull_header(skb);
cb80ef463d1881 Benjamin LaHaise     2012-04-27  739  
d826eb14ecef35 Eric Dumazet         2011-11-09  740  	skb_dst_drop(skb);
cb75994ec311b2 Wang Chen            2007-12-03  741  
850cbaddb52dfd Paolo Abeni          2016-10-21  742  	return __udpv6_queue_rcv_skb(sk, skb);
3e215c8d1b6b77 James M Leddy        2014-06-25  743  
6a5dc9e598fe90 Eric Dumazet         2013-04-29  744  csum_error:
02c223470c3cc3 Eric Dumazet         2016-04-27  745  	__UDP6_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS, is_udplite);
ba4e58eca8aa94 Gerrit Renker        2006-11-27  746  drop:
02c223470c3cc3 Eric Dumazet         2016-04-27  747  	__UDP6_INC_STATS(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
cb80ef463d1881 Benjamin LaHaise     2012-04-27  748  	atomic_inc(&sk->sk_drops);
ba4e58eca8aa94 Gerrit Renker        2006-11-27  749  	kfree_skb(skb);
ba4e58eca8aa94 Gerrit Renker        2006-11-27  750  	return -1;
^1da177e4c3f41 Linus Torvalds       2005-04-16  751  }
^1da177e4c3f41 Linus Torvalds       2005-04-16  752  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 61714 bytes --]

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

* Re: [PATCH net-next 0/2] net: snmp: tracepoint support for snmp
  2021-11-12 14:31         ` Steven Rostedt
@ 2021-11-16  2:27           ` Menglong Dong
  0 siblings, 0 replies; 13+ messages in thread
From: Menglong Dong @ 2021-11-16  2:27 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Jakub Kicinski, David Miller, mingo, Hideaki YOSHIFUJI, dsahern,
	Menglong Dong, LKML, netdev

Hello~

On Fri, Nov 12, 2021 at 10:31 PM Steven Rostedt <rostedt@goodmis.org> wrote:
>
> On Fri, 12 Nov 2021 14:42:23 +0800
> Menglong Dong <menglong8.dong@gmail.com> wrote:
>
> > What's more, I have also realized another version: create tracepoint for every
> > statistics type, such as snmp_udp_incsumerrors, snmp_udp_rcvbuferrors, etc.
> > This can solve performance issue, as users can enable part of them, which
> > may be triggered not frequently. However, too many tracepoint are created, and
> > I think it may be not applicable.
>
> If possible, it would be great to have a single tracepoint to handle all
> statistics (not sure what data it will be having). Or at least break it
> down to one tracepoint per group of statistics.
>
> There's two approaches that can be taken.
>
> 1) Create a DECLARE_EVENT_CLASS() template that the group of tracepoints
> use, and then create a DEFINE_EVENT() for each one. This will create a
> separate trace event for each stat. Most the footprint of a trace event is
> in the CLASS portion, so having a single class helps keep the size overhead
> down.
>

In fact, I think I'm using the first idea. I defined the DEFINE_SNMP_EVENT() in
https://lore.kernel.org/all/20211111133530.2156478-2-imagedong@tencent.com/,
which is used to create the tracepoint for each group. And I plan to create
tracepoint by protocols. such as: events/snmp/snmp_udp, events/snmp/snmp_tcp,
events/snmp/snmp_icmp, etc. And every trace event have a type field, which is
used to simply filter by statistics type:

+DECLARE_EVENT_CLASS(snmp_template,
+
+       TP_PROTO(struct sk_buff *skb, int field, int val),
+
+       TP_ARGS(skb, field, val),
+
+       TP_STRUCT__entry(
+               __field(void *, skbaddr)
+               __field(int, field)
+               __field(int, val)
+       ),
+
+       TP_fast_assign(
+               __entry->skbaddr = skb;
+               __entry->field = field;
+               __entry->val = val;
+       ),
+
+       TP_printk("skbaddr=%p, field=%d, val=%d", __entry->skbaddr,
+                 __entry->field, __entry->val)
+);
+
+#define DEFINE_SNMP_EVENT(proto)                               \
+DEFINE_EVENT(snmp_template, snmp_##proto,                      \
+       TP_PROTO(struct sk_buff *skb, int field, int val),      \
+       TP_ARGS(skb, field, val)                                \
+)

I think using a single trace event may have performance impact?

I will post the complete patch series after netdev opens.

Thanks!
Menglong Dong

> 2) Just use a single trace event for all stats in a group, but perhaps have
> a type field for each to use. That way it can be easy to filter on a set of
> stats to trace.
>
> -- Steve

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

* Re: [PATCH net-next 1/2] net: snmp: add tracepoint support for snmp
  2021-11-11 13:35 ` [PATCH net-next 1/2] net: snmp: add " menglong8.dong
@ 2021-11-16 21:34   ` Steven Rostedt
  2021-11-17 13:55     ` Menglong Dong
  0 siblings, 1 reply; 13+ messages in thread
From: Steven Rostedt @ 2021-11-16 21:34 UTC (permalink / raw)
  To: menglong8.dong
  Cc: kuba, davem, mingo, yoshfuji, dsahern, imagedong, linux-kernel, netdev

On Thu, 11 Nov 2021 21:35:29 +0800
menglong8.dong@gmail.com wrote:

> +#define DEFINE_SNMP_EVENT(proto)				\
> +DEFINE_EVENT(snmp_template, snmp_##proto,			\
> +	TP_PROTO(struct sk_buff *skb, int field, int val),	\
> +	TP_ARGS(skb, field, val)				\
> +)
> +
> +#define TRACE_SNMP(skb, proto, field, val) \
> +	trace_snmp_##proto(skb, field, val)
> +
> +#endif

Why make a separate trace event for each protocol, and not just create an
enum that gets passed to the trace event? Then you could just filter on
what you want.

-- Steve

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

* Re: [PATCH net-next 1/2] net: snmp: add tracepoint support for snmp
  2021-11-16 21:34   ` Steven Rostedt
@ 2021-11-17 13:55     ` Menglong Dong
  0 siblings, 0 replies; 13+ messages in thread
From: Menglong Dong @ 2021-11-17 13:55 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Jakub Kicinski, David Miller, mingo, Hideaki YOSHIFUJI, dsahern,
	Menglong Dong, LKML, netdev

On Wed, Nov 17, 2021 at 5:34 AM Steven Rostedt <rostedt@goodmis.org> wrote:
>
> On Thu, 11 Nov 2021 21:35:29 +0800
> menglong8.dong@gmail.com wrote:
>
> > +#define DEFINE_SNMP_EVENT(proto)                             \
> > +DEFINE_EVENT(snmp_template, snmp_##proto,                    \
> > +     TP_PROTO(struct sk_buff *skb, int field, int val),      \
> > +     TP_ARGS(skb, field, val)                                \
> > +)
> > +
> > +#define TRACE_SNMP(skb, proto, field, val) \
> > +     trace_snmp_##proto(skb, field, val)
> > +
> > +#endif
>
> Why make a separate trace event for each protocol, and not just create an
> enum that gets passed to the trace event? Then you could just filter on
> what you want.

enn....I'm not sure, just feel comfortable to create a separate trace event for
each protocol. Maybe it is easier to use? However, making them together
seems more fridently to users who want to do statistics for all protocols. I'll
think over it~~~

Thanks!
Menglong Dong

>
> -- Steve

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

end of thread, other threads:[~2021-11-17 13:56 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-11 13:35 [PATCH net-next 0/2] net: snmp: tracepoint support for snmp menglong8.dong
2021-11-11 13:35 ` [PATCH net-next 1/2] net: snmp: add " menglong8.dong
2021-11-16 21:34   ` Steven Rostedt
2021-11-17 13:55     ` Menglong Dong
2021-11-11 13:35 ` [PATCH net-next 2/2] net: snmp: add snmp tracepoint support for udp menglong8.dong
2021-11-11 21:07   ` kernel test robot
2021-11-13  3:32   ` kernel test robot
2021-11-11 14:08 ` [PATCH net-next 0/2] net: snmp: tracepoint support for snmp Jakub Kicinski
2021-11-12  1:40   ` Menglong Dong
2021-11-12  1:50     ` Jakub Kicinski
2021-11-12  6:42       ` Menglong Dong
2021-11-12 14:31         ` Steven Rostedt
2021-11-16  2:27           ` Menglong Dong

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