Skip to contentSkip to conversation

net: tcp: sctp: dccp: Replace jprobe usage with trace events

PATCH Superseded Masami Hiramatsu 3 participants 12 messages Dec 18, 2017 – Dec 20, 2017

Subsystems (5)

v2 of 7 Superseded Latest is v7 →

lore
Share & tools
lore

Masami Hiramatsu

author maintainer
#0 lore raw

v2 cover net: tcp: sctp: dccp: Replace jprobe usage with trace events

Hi,

This series is v2 of the replacement of jprobe usage with trace events, and is just rebased on current tip/master branch.

Please review it and test it.
Anyway, this removes all {tcp,sctp,dccp}_probe.ko because those depend on jprobe.

This introduce new trace events which allows user to trace network congestion window etc. via ftrace or perftools. And remove jprobe usages (tcp_probe/dccp_probe/sctp_probe). So this series removes all register_jprobe users from the kernel tree.

So following example in

https://wiki.linuxfoundation.org/networking/tcpprobe

 # modprobe tcp_probe portP01
 # cat /proc/net/tcpprobe >/tmp/data.out &
 # pid=$!
 # iperf -c otherhost
 # kill $pid

will be changed as below;

 # cd <debugfs or tracefs>/tracing
 # echo 1 > events/tcp/tcp_probe/enable
 # echo "sport = 5001 || dport = 5001"  > events/tcp/tcp_probe/filter
 # tail -f trace_pipe > /tmp/data.out &
 # pid=$!
 # iperf -c otherhost
 # kill $pid

And it outouts logs lile below;

# tracer: nop
#
# _-----=> irqs-off
# / _----=> need-resched

#                            | / _---=> hardirq/softirq
#                            || / _--=> preempt-depth
#                            ||| /     delay
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
#              | |       |   ||||       |         |
          <idle>-0     [000] ..s2  1089.238049: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length7 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(960
          <idle>-0     [000] ..s2  1090.156938: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length7 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(992
          <idle>-0     [000] ..s2  1091.333729: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length8 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(992
          <idle>-0     [000] ..s2  1092.300330: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length7 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(992
          <idle>-0     [000] ..s2  1095.044739: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length6 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(992
          <idle>-0     [000] ..s2  1096.573825: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length2 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(992

I need your feedback for this change, like formatting etc. Also, I need more test for this events by who can setup DCCP and SCTP, since those are special protocols, I have no environment to test it.

Steve, I also wrote a hack in sctp_probe event. In that event it calls trace_sctp_probe_path() directly and record it. This means an event invokes another event inside. As far as I can see, that seems OK.
But I need your review too.

Thank you,

---

Masami Hiramatsu (6):
net: tcp: Add trace events for TCP congestion window tracing
net: tcp: Remove TCP probe module
net: sctp: Add SCTP ACK tracking trace event
net: sctp: Remove debug SCTP probe module
net: dccp: Add DCCP sendmsg trace event
net: dccp: Remove dccpprobe module

 include/trace/events/sctp.h |   96 ++++++++++++++
 include/trace/events/tcp.h  |   86 ++++++++++++
 net/Kconfig                 |   17 --
 net/core/net-traces.c       |    1 
 net/dccp/Kconfig            |   17 --
 net/dccp/Makefile           |    2 
 net/dccp/probe.c            |  203 -----------------------------
 net/dccp/proto.c            |    5 +
 net/dccp/trace.h            |  105 +++++++++++++++
 net/ipv4/Makefile           |    1 
 net/ipv4/tcp_input.c        |    3 
 net/ipv4/tcp_probe.c        |  301 -------------------------------------------
 net/sctp/Kconfig            |   12 --
 net/sctp/Makefile           |    3 
 net/sctp/probe.c            |  244 -----------------------------------
 net/sctp/sm_statefuns.c     |    5 +
 16 files changed, 301 insertions(+), 800 deletions(-)
 create mode 100644 include/trace/events/sctp.h
 delete mode 100644 net/dccp/probe.c
 create mode 100644 net/dccp/trace.h
 delete mode 100644 net/ipv4/tcp_probe.c
 delete mode 100644 net/sctp/probe.c

--
Masami Hiramatsu (Linaro) <[email protected]>

author maintainer
#1 lore raw

PATCH v2 1/6 net: tcp: Add trace events for TCP congestion window tracing

This adds an event to trace TCP stat variables with slightly intrusive trace-event. This uses ftrace/perf event log buffer to trace those state, no needs to prepare own ring-buffer, nor custom user apps.

User can use ftrace to trace this event as below;

  # cd /sys/kernel/debug/tracing
  # echo 1 > events/tcp/tcp_probe/enable
  (run workloads)
  # cat trace
---
 include/trace/events/tcp.h |   86 ++++++++++++++++++++++++++++++++++++++++++++
 net/core/net-traces.c      |    1 +
 net/ipv4/tcp_input.c       |    3 ++
 3 files changed, 90 insertions(+)
include/trace/events/tcp.h +86 -0
index 07cccca6cbf1..77c26a37d5ce 100644
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 #undef TRACE_SYSTEM
 #define TRACE_SYSTEM tcp
 
@@ -293,6 +294,91 @@ TRACE_EVENT(tcp_retransmit_synack,
 		  __entry->saddr_v6, __entry->daddr_v6)
 );
 
+#include <net/tcp.h>
+#include <linux/tcp.h>
+#include <linux/ipv6.h>
+#include <uapi/linux/in.h>
+#include <uapi/linux/in6.h>
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(tcp_probe,
+
+	TP_PROTO(struct sock *sk, struct sk_buff *skb),
+
+	TP_ARGS(sk, skb),
+
+	TP_STRUCT__entry(
+		/* sockaddr_in6 is always bigger than sockaddr_in */
+		__array(__u8, saddr, sizeof(struct sockaddr_in6))
+		__array(__u8, daddr, sizeof(struct sockaddr_in6))
+		__field(__u16, sport)
+		__field(__u16, dport)
+		__field(__u32, mark)
+		__field(__u16, length)
+		__field(__u32, snd_nxt)
+		__field(__u32, snd_una)
+		__field(__u32, snd_cwnd)
+		__field(__u32, ssthresh)
+		__field(__u32, snd_wnd)
+		__field(__u32, srtt)
+		__field(__u32, rcv_wnd)
+	),
+
+	TP_fast_assign(
+		const struct tcp_sock *tp = tcp_sk(sk);
+		const struct inet_sock *inet = inet_sk(sk);
+
+		memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
+		memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
+
+		if (sk->sk_family = AF_INET) {
+			struct sockaddr_in *v4 = (void *)__entry->saddr;
+
+			v4->sin_family = AF_INET;
+			v4->sin_port = inet->inet_sport;
+			v4->sin_addr.s_addr = inet->inet_saddr;
+			v4 = (void *)__entry->daddr;
+			v4->sin_family = AF_INET;
+			v4->sin_port = inet->inet_dport;
+			v4->sin_addr.s_addr = inet->inet_daddr;
+#if IS_ENABLED(CONFIG_IPV6)
+		} else if (sk->sk_family = AF_INET6) {
+			struct sockaddr_in6 *v6 = (void *)__entry->saddr;
+
+			v6->sin6_family = AF_INET6;
+			v6->sin6_port = inet->inet_sport;
+			v6->sin6_addr = inet6_sk(sk)->saddr;
+			v6 = (void *)__entry->daddr;
+			v6->sin6_family = AF_INET6;
+			v6->sin6_port = inet->inet_dport;
+			v6->sin6_addr = sk->sk_v6_daddr;
+#endif
+		}
+
+		/* For filtering use */
+		__entry->sport = ntohs(inet->inet_sport);
+		__entry->dport = ntohs(inet->inet_dport);
+		__entry->mark = skb->mark;
+
+		__entry->length = skb->len;
+		__entry->snd_nxt = tp->snd_nxt;
+		__entry->snd_una = tp->snd_una;
+		__entry->snd_cwnd = tp->snd_cwnd;
+		__entry->snd_wnd = tp->snd_wnd;
+		__entry->rcv_wnd = tp->rcv_wnd;
+		__entry->ssthresh = tcp_current_ssthresh(sk);
+		__entry->srtt = tp->srtt_us >> 3;
+	),
+
+	TP_printk("src=%pISpc dest=%pISpc mark=%#x length=%d snd_nxt=%#x "
+		  "snd_una=%#x snd_cwnd=%u ssthresh=%u snd_wnd=%u srtt=%u "
+		  "rcv_wnd=%u",
+		  __entry->saddr, __entry->daddr, __entry->mark,
+		  __entry->length, __entry->snd_nxt, __entry->snd_una,
+		  __entry->snd_cwnd, __entry->ssthresh, __entry->snd_wnd,
+		  __entry->srtt, __entry->rcv_wnd)
+);
+
 #endif /* _TRACE_TCP_H */
 
 /* This part must be outside protection */
net/core/net-traces.c +1 -0
index 380934580fa1..25b9334ef065 100644
@@ -31,6 +31,7 @@
 #include <trace/events/net.h>
 #include <trace/events/napi.h>
 #include <trace/events/sock.h>
+#include <trace/events/tcp.h>
 #include <trace/events/udp.h>
 #include <trace/events/tcp.h>
 #include <trace/events/fib.h>
net/ipv4/tcp_input.c +3 -0
index 45f750e85714..fa19cc86b2ad 100644
@@ -5306,6 +5306,9 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
 	unsigned int len = skb->len;
 	struct tcp_sock *tp = tcp_sk(sk);
 
+	/* TCP congestion window tracking */
+	trace_tcp_probe(sk, skb);
+
 	tcp_mstamp_refresh(tp);
 	if (unlikely(!sk->sk_rx_dst))
 		inet_csk(sk)->icsk_af_ops->sk_rx_dst_set(sk, skb);
#2 lore raw

Re: [v2 PATCH -tip 1/6] net: tcp: Add trace events for TCP congestion window tracing

I love your patch! Yet something to improve:

Hi Masami,

I love your patch! Yet something to improve:

[auto build test ERROR on net/master]
[also build test ERROR on v4.15-rc4 next-20171219]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Masami-Hiramatsu/net-tcp-sctp-dccp-Replace-jprobe-usage-with-trace-events/20171220-081035
config: sh-allmodconfig (attached as .config)
compiler: sh4-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=sh

All error/warnings (new ones prefixed by >>):

In file included from include/trace/events/udp.h:9:0,

                    from net//core/net-traces.c:35:
>> include/trace/events/tcp.h:37:11: error: expected ')' before 'const'
     TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
              ^
   include/linux/tracepoint.h:105:27: note: in definition of macro 'TP_PROTO'
    #define TP_PROTO(args...) args
                              ^~~~
>> include/linux/tracepoint.h:237:20: error: redefinition of '__tpstrtab_tcp_retransmit_skb'
     static const char __tpstrtab_##name[]     \
                       ^
>> include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
     DEFINE_TRACE_FN(name, NULL, NULL);
     ^~~~~~~~~~~~~~~
>> include/trace/define_trace.h:51:2: note: in expansion of macro 'DEFINE_TRACE'
     DEFINE_TRACE(name)
     ^~~~~~~~~~~~
>> include/trace/events/tcp.h:90:1: note: in expansion of macro 'DEFINE_EVENT'
    DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
    ^~~~~~~~~~~~
   In file included from include/trace/events/tcp.h:10:0,
                    from net//core/net-traces.c:34:
   include/linux/tracepoint.h:237:20: note: previous definition of '__tpstrtab_tcp_retransmit_skb' was here
     static const char __tpstrtab_##name[]     \
                       ^
>> include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
     DEFINE_TRACE_FN(name, NULL, NULL);
     ^~~~~~~~~~~~~~~
>> include/trace/define_trace.h:51:2: note: in expansion of macro 'DEFINE_TRACE'
     DEFINE_TRACE(name)
     ^~~~~~~~~~~~
>> include/trace/events/tcp.h:90:1: note: in expansion of macro 'DEFINE_EVENT'
    DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
    ^~~~~~~~~~~~
   In file included from include/trace/events/udp.h:9:0,
                    from net//core/net-traces.c:35:
   include/linux/tracepoint.h:239:20: error: redefinition of '__tracepoint_tcp_retransmit_skb'
     struct tracepoint __tracepoint_##name     \
                       ^
>> include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
     DEFINE_TRACE_FN(name, NULL, NULL);
     ^~~~~~~~~~~~~~~
>> include/trace/define_trace.h:51:2: note: in expansion of macro 'DEFINE_TRACE'
     DEFINE_TRACE(name)
     ^~~~~~~~~~~~
>> include/trace/events/tcp.h:90:1: note: in expansion of macro 'DEFINE_EVENT'
    DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
    ^~~~~~~~~~~~
   In file included from include/trace/events/tcp.h:10:0,
                    from net//core/net-traces.c:34:
   include/linux/tracepoint.h:239:20: note: previous definition of '__tracepoint_tcp_retransmit_skb' was here
     struct tracepoint __tracepoint_##name     \
                       ^
>> include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
     DEFINE_TRACE_FN(name, NULL, NULL);
     ^~~~~~~~~~~~~~~
>> include/trace/define_trace.h:51:2: note: in expansion of macro 'DEFINE_TRACE'
     DEFINE_TRACE(name)
     ^~~~~~~~~~~~
>> include/trace/events/tcp.h:90:1: note: in expansion of macro 'DEFINE_EVENT'
    DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
    ^~~~~~~~~~~~
   In file included from include/trace/events/udp.h:9:0,
                    from net//core/net-traces.c:35:
>> include/linux/tracepoint.h:242:35: error: redefinition of '__tracepoint_ptr_tcp_retransmit_skb'
     static struct tracepoint * const __tracepoint_ptr_##name __used  \
                                      ^
>> include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
     DEFINE_TRACE_FN(name, NULL, NULL);
     ^~~~~~~~~~~~~~~
>> include/trace/define_trace.h:51:2: note: in expansion of macro 'DEFINE_TRACE'
     DEFINE_TRACE(name)
     ^~~~~~~~~~~~
>> include/trace/events/tcp.h:90:1: note: in expansion of macro 'DEFINE_EVENT'
    DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
    ^~~~~~~~~~~~
   In file included from include/trace/events/tcp.h:10:0,
                    from net//core/net-traces.c:34:
   include/linux/tracepoint.h:242:35: note: previous definition of '__tracepoint_ptr_tcp_retransmit_skb' was here
     static struct tracepoint * const __tracepoint_ptr_##name __used  \
                                      ^
>> include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
     DEFINE_TRACE_FN(name, NULL, NULL);
     ^~~~~~~~~~~~~~~
>> include/trace/define_trace.h:51:2: note: in expansion of macro 'DEFINE_TRACE'
     DEFINE_TRACE(name)
     ^~~~~~~~~~~~

vim +37 include/trace/events/tcp.h

e086101b Cong Wang   2017-10-13  12  
e8fce239 Song Liu    2017-10-23  13  #define tcp_state_name(state)	{ state, #state }
e8fce239 Song Liu    2017-10-23  14  #define show_tcp_state_name(val)			\
e8fce239 Song Liu    2017-10-23  15  	__print_symbolic(val,				\
e8fce239 Song Liu    2017-10-23  16  		tcp_state_name(TCP_ESTABLISHED),	\
e8fce239 Song Liu    2017-10-23  17  		tcp_state_name(TCP_SYN_SENT),		\
e8fce239 Song Liu    2017-10-23  18  		tcp_state_name(TCP_SYN_RECV),		\
e8fce239 Song Liu    2017-10-23  19  		tcp_state_name(TCP_FIN_WAIT1),		\
e8fce239 Song Liu    2017-10-23  20  		tcp_state_name(TCP_FIN_WAIT2),		\
e8fce239 Song Liu    2017-10-23  21  		tcp_state_name(TCP_TIME_WAIT),		\
e8fce239 Song Liu    2017-10-23  22  		tcp_state_name(TCP_CLOSE),		\
e8fce239 Song Liu    2017-10-23  23  		tcp_state_name(TCP_CLOSE_WAIT),		\
e8fce239 Song Liu    2017-10-23  24  		tcp_state_name(TCP_LAST_ACK),		\
e8fce239 Song Liu    2017-10-23  25  		tcp_state_name(TCP_LISTEN),		\
e8fce239 Song Liu    2017-10-23  26  		tcp_state_name(TCP_CLOSING),		\
e8fce239 Song Liu    2017-10-23  27  		tcp_state_name(TCP_NEW_SYN_RECV))
e8fce239 Song Liu    2017-10-23  28  
f6e37b25 Song Liu    2017-10-23  29  /*
f6e37b25 Song Liu    2017-10-23  30   * tcp event with arguments sk and skb
f6e37b25 Song Liu    2017-10-23  31   *
f6e37b25 Song Liu    2017-10-23  32   * Note: this class requires a valid sk pointer; while skb pointer could
f6e37b25 Song Liu    2017-10-23  33   *       be NULL.
f6e37b25 Song Liu    2017-10-23  34   */
f6e37b25 Song Liu    2017-10-23 @35  DECLARE_EVENT_CLASS(tcp_event_sk_skb,
e086101b Cong Wang   2017-10-13  36  
7344e29f Song Liu    2017-10-23 @37  	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
e086101b Cong Wang   2017-10-13  38  
e086101b Cong Wang   2017-10-13  39  	TP_ARGS(sk, skb),
e086101b Cong Wang   2017-10-13  40  
e086101b Cong Wang   2017-10-13  41  	TP_STRUCT__entry(
7344e29f Song Liu    2017-10-23  42  		__field(const void *, skbaddr)
7344e29f Song Liu    2017-10-23  43  		__field(const void *, skaddr)
e086101b Cong Wang   2017-10-13  44  		__field(__u16, sport)
e086101b Cong Wang   2017-10-13  45  		__field(__u16, dport)
e086101b Cong Wang   2017-10-13  46  		__array(__u8, saddr, 4)
e086101b Cong Wang   2017-10-13  47  		__array(__u8, daddr, 4)
e086101b Cong Wang   2017-10-13  48  		__array(__u8, saddr_v6, 16)
e086101b Cong Wang   2017-10-13  49  		__array(__u8, daddr_v6, 16)
e086101b Cong Wang   2017-10-13  50  	),
e086101b Cong Wang   2017-10-13  51  
e086101b Cong Wang   2017-10-13  52  	TP_fast_assign(
e086101b Cong Wang   2017-10-13  53  		struct inet_sock *inet = inet_sk(sk);
e086101b Cong Wang   2017-10-13  54  		struct in6_addr *pin6;
e086101b Cong Wang   2017-10-13  55  		__be32 *p32;
e086101b Cong Wang   2017-10-13  56  
e086101b Cong Wang   2017-10-13  57  		__entry->skbaddr = skb;
e086101b Cong Wang   2017-10-13  58  		__entry->skaddr = sk;
e086101b Cong Wang   2017-10-13  59  
e086101b Cong Wang   2017-10-13  60  		__entry->sport = ntohs(inet->inet_sport);
e086101b Cong Wang   2017-10-13  61  		__entry->dport = ntohs(inet->inet_dport);
e086101b Cong Wang   2017-10-13  62  
e086101b Cong Wang   2017-10-13  63  		p32 = (__be32 *) __entry->saddr;
e086101b Cong Wang   2017-10-13  64  		*p32 = inet->inet_saddr;
e086101b Cong Wang   2017-10-13  65  
e086101b Cong Wang   2017-10-13  66  		p32 = (__be32 *) __entry->daddr;
e086101b Cong Wang   2017-10-13  67  		*p32 =  inet->inet_daddr;
e086101b Cong Wang   2017-10-13  68  
89005678 David Ahern 2017-10-18  69  #if IS_ENABLED(CONFIG_IPV6)
89005678 David Ahern 2017-10-18  70  		if (sk->sk_family == AF_INET6) {
e086101b Cong Wang   2017-10-13  71  			pin6 = (struct in6_addr *)__entry->saddr_v6;
386fd5da David Ahern 2017-10-16  72  			*pin6 = sk->sk_v6_rcv_saddr;
e086101b Cong Wang   2017-10-13  73  			pin6 = (struct in6_addr *)__entry->daddr_v6;
386fd5da David Ahern 2017-10-16  74  			*pin6 = sk->sk_v6_daddr;
89005678 David Ahern 2017-10-18  75  		} else
89005678 David Ahern 2017-10-18  76  #endif
89005678 David Ahern 2017-10-18  77  		{
e086101b Cong Wang   2017-10-13  78  			pin6 = (struct in6_addr *)__entry->saddr_v6;
e086101b Cong Wang   2017-10-13  79  			ipv6_addr_set_v4mapped(inet->inet_saddr, pin6);
e086101b Cong Wang   2017-10-13  80  			pin6 = (struct in6_addr *)__entry->daddr_v6;
e086101b Cong Wang   2017-10-13  81  			ipv6_addr_set_v4mapped(inet->inet_daddr, pin6);
e086101b Cong Wang   2017-10-13  82  		}
e086101b Cong Wang   2017-10-13  83  	),
e086101b Cong Wang   2017-10-13  84  
fb6ff75e David Ahern 2017-10-16  85  	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
e086101b Cong Wang   2017-10-13  86  		  __entry->sport, __entry->dport, __entry->saddr, __entry->daddr,
e086101b Cong Wang   2017-10-13  87  		  __entry->saddr_v6, __entry->daddr_v6)
e086101b Cong Wang   2017-10-13  88  );
e086101b Cong Wang   2017-10-13  89  
f6e37b25 Song Liu    2017-10-23 @90  DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
f6e37b25 Song Liu    2017-10-23  91  
7344e29f Song Liu    2017-10-23  92  	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
f6e37b25 Song Liu    2017-10-23  93  
f6e37b25 Song Liu    2017-10-23  94  	TP_ARGS(sk, skb)
f6e37b25 Song Liu    2017-10-23  95  );
f6e37b25 Song Liu    2017-10-23  96  

:::::: The code at line 37 was first introduced by commit
:::::: 7344e29f285a94b965075599731811c352f3ab40 tcp: mark trace event arguments sk and skb as const

:::::: TO: Song Liu <[email protected]> :::::: CC: David S. Miller <[email protected]>

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

author maintainer
#3 lore raw

PATCH v2 2/6 net: tcp: Remove TCP probe module

In reply to Masami Hiramatsu

Remove TCP probe module since jprobe has been deprecated. That function is now replaced by tcp/tcp_probe trace-event. You can use it via ftrace or perftools.

---
 net/Kconfig          |   17 ---
 net/ipv4/Makefile    |    1 
 net/ipv4/tcp_probe.c |  301 --------------------------------------------------
 3 files changed, 319 deletions(-)
 delete mode 100644 net/ipv4/tcp_probe.c
net/Kconfig +0 -17
index 9dba2715919d..efe930db3c08 100644
@@ -336,23 +336,6 @@ config NET_PKTGEN
 	  To compile this code as a module, choose M here: the
 	  module will be called pktgen.
 
-config NET_TCPPROBE
-	tristate "TCP connection probing"
-	depends on INET && PROC_FS && KPROBES
-	---help---
-	This module allows for capturing the changes to TCP connection
-	state in response to incoming packets. It is used for debugging
-	TCP congestion avoidance modules. If you don't understand
-	what was just said, you don't need it: say N.
-
-	Documentation on how to use TCP connection probing can be found
-	at:
-	
-	  http://www.linuxfoundation.org/collaborate/workgroups/networking/tcpprobe
-
-	To compile this code as a module, choose M here: the
-	module will be called tcp_probe.
-
 config NET_DROP_MONITOR
 	tristate "Network packet drop alerting service"
 	depends on INET && TRACEPOINTS
net/ipv4/Makefile +0 -1
index c6c8ad1d4b6d..47a0a6649a9d 100644
@@ -43,7 +43,6 @@ obj-$(CONFIG_INET_DIAG) += inet_diag.o
 obj-$(CONFIG_INET_TCP_DIAG) += tcp_diag.o
 obj-$(CONFIG_INET_UDP_DIAG) += udp_diag.o
 obj-$(CONFIG_INET_RAW_DIAG) += raw_diag.o
-obj-$(CONFIG_NET_TCPPROBE) += tcp_probe.o
 obj-$(CONFIG_TCP_CONG_BBR) += tcp_bbr.o
 obj-$(CONFIG_TCP_CONG_BIC) += tcp_bic.o
 obj-$(CONFIG_TCP_CONG_CDG) += tcp_cdg.o
net/ipv4/tcp_probe.c deleted +0 -301

301 lines not on this page · raw message

author maintainer
#4 lore raw

PATCH v2 3/6 net: sctp: Add SCTP ACK tracking trace event

In reply to Masami Hiramatsu

Add SCTP ACK tracking trace event to trace the changes of SCTP association state in response to incoming packets. It is used for debugging SCTP congestion control algorithms, and will replace sctp_probe module.

Note that this event a bit tricky. Since this consists of 2 events (sctp_probe and sctp_probe_path) so you have to enable both events as below.

  # cd /sys/kernel/debug/tracing
  # echo 1 > events/sctp/sctp_probe/enable
  # echo 1 > events/sctp/sctp_probe_path/enable

Or, you can enable all the events under sctp.

  # echo 1 > events/sctp/enable

Since sctp_probe_path event is always invoked from sctp_probe event, you can not see any output if you only enable sctp_probe_path.

---
 include/trace/events/sctp.h |   96 +++++++++++++++++++++++++++++++++++++++++++
 net/sctp/sm_statefuns.c     |    5 ++
 2 files changed, 101 insertions(+)
 create mode 100644 include/trace/events/sctp.h
include/trace/events/sctp.h new file +96 -0
new file mode 100644
index 000000000000..32c2dc72311e
@@ -0,0 +1,96 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM sctp
+
+#if !defined(_TRACE_SCTP_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_SCTP_H
+
+#include <net/sctp/structs.h>
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(sctp_probe_path,
+
+	TP_PROTO(struct sctp_transport *sp,
+		 const struct sctp_association *asoc),
+
+	TP_ARGS(sp, asoc),
+
+	TP_STRUCT__entry(
+		__field(__u64, asoc)
+		__field(__u32, primary)
+		__array(__u8, ipaddr, sizeof(union sctp_addr))
+		__field(__u32, state)
+		__field(__u32, cwnd)
+		__field(__u32, ssthresh)
+		__field(__u32, flight_size)
+		__field(__u32, partial_bytes_acked)
+		__field(__u32, pathmtu)
+	),
+
+	TP_fast_assign(
+		__entry->asoc = (__u64)asoc;
+		__entry->primary = (sp = asoc->peer.primary_path);
+		memcpy(__entry->ipaddr, &sp->ipaddr, sizeof(union sctp_addr));
+		__entry->state = sp->state;
+		__entry->cwnd = sp->cwnd;
+		__entry->ssthresh = sp->ssthresh;
+		__entry->flight_size = sp->flight_size;
+		__entry->partial_bytes_acked = sp->partial_bytes_acked;
+		__entry->pathmtu = sp->pathmtu;
+	),
+
+	TP_printk("asoc=%#llx%s ipaddr=%pISpc state=%u cwnd=%u ssthresh=%u "
+		  "flight_size=%u partial_bytes_acked=%u pathmtu=%u",
+		  __entry->asoc, __entry->primary ? "(*)" : "",
+		  __entry->ipaddr, __entry->state, __entry->cwnd,
+		  __entry->ssthresh, __entry->flight_size,
+		  __entry->partial_bytes_acked, __entry->pathmtu)
+);
+
+TRACE_EVENT(sctp_probe,
+
+	TP_PROTO(const struct sctp_endpoint *ep,
+		 const struct sctp_association *asoc,
+		 struct sctp_chunk *chunk),
+
+	TP_ARGS(ep, asoc, chunk),
+
+	TP_STRUCT__entry(
+		__field(__u64, asoc)
+		__field(__u32, mark)
+		__field(__u16, bind_port)
+		__field(__u16, peer_port)
+		__field(__u32, pathmtu)
+		__field(__u32, rwnd)
+		__field(__u16, unack_data)
+	),
+
+	TP_fast_assign(
+		struct sctp_transport *sp;
+		struct sk_buff *skb = chunk->skb;
+
+		__entry->asoc = (__u64)asoc;
+		__entry->mark = skb->mark;
+		__entry->bind_port = ep->base.bind_addr.port;
+		__entry->peer_port = asoc->peer.port;
+		__entry->pathmtu = asoc->pathmtu;
+		__entry->rwnd = asoc->peer.rwnd;
+		__entry->unack_data = asoc->unack_data;
+
+		list_for_each_entry(sp, &asoc->peer.transport_addr_list,
+				    transports) {
+			trace_sctp_probe_path(sp, asoc);
+		}
+	),
+
+	TP_printk("asoc=%#llx mark=%#x bind_port=%d peer_port=%d pathmtu=%d "
+		  "rwnd=%u unack_data=%d",
+		  __entry->asoc, __entry->mark, __entry->bind_port,
+		  __entry->peer_port, __entry->pathmtu, __entry->rwnd,
+		  __entry->unack_data)
+);
+
+#endif /* _TRACE_SCTP_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
net/sctp/sm_statefuns.c +5 -0
index 8f8ccded13e4..c5f92b2cc5c3 100644
@@ -59,6 +59,9 @@
 #include <net/sctp/sm.h>
 #include <net/sctp/structs.h>
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/sctp.h>
+
 static struct sctp_packet *sctp_abort_pkt_new(
 					struct net *net,
 					const struct sctp_endpoint *ep,
@@ -3219,6 +3222,8 @@ enum sctp_disposition sctp_sf_eat_sack_6_2(struct net *net,
 	struct sctp_sackhdr *sackh;
 	__u32 ctsn;
 
+	trace_sctp_probe(ep, asoc, chunk);
+
 	if (!sctp_vtag_verify(chunk, asoc))
 		return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
 
maintainer
#5 lore raw

Re: [v2 PATCH -tip 3/6] net: sctp: Add SCTP ACK tracking trace event

Quoted 13 lines · On Mon, 18 Dec 2017 17:12:15 +0900 Masami Hiramatsu <[email protected]> wrote:

Add SCTP ACK tracking trace event to trace the changes of SCTP association state in response to incoming packets. It is used for debugging SCTP congestion control algorithms, and will replace sctp_probe module.

Note that this event a bit tricky. Since this consists of 2 events (sctp_probe and sctp_probe_path) so you have to enable both events as below.

  # cd /sys/kernel/debug/tracing
  # echo 1 > events/sctp/sctp_probe/enable
  # echo 1 > events/sctp/sctp_probe_path/enable
Quoted 7 lines

Or, you can enable all the events under sctp.

  # echo 1 > events/sctp/enable

Since sctp_probe_path event is always invoked from sctp_probe event, you can not see any output if you only enable sctp_probe_path.

I have to ask, why did you do it this way?

Quoted 16 lines
include/trace/events/sctp.h new file +1 -0
+#include <trace/define_trace.h>
net/sctp/sm_statefuns.c +3 -0
index 8f8ccded13e4..c5f92b2cc5c3 100644
@@ -59,6 +59,9 @@
 #include <net/sctp/sm.h>
 #include <net/sctp/structs.h>
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/sctp.h>
+
 static struct sctp_packet *sctp_abort_pkt_new(
 					struct net *net,
 					const struct sctp_endpoint *ep,

net/sctp/sm_statefuns.c enum sctp_disposition sctp_sf_eat_sack_6_2(struct net *net, · line 3225

Quoted 4 lines
net/sctp/sm_statefuns.c +1 -0
@@ -3219,6 +3222,8 @@ enum sctp_disposition sctp_sf_eat_sack_6_2(struct net *net,
 	struct sctp_sackhdr *sackh;
 	__u32 ctsn;
 
+	trace_sctp_probe(ep, asoc, chunk);

What about doing this right after this probe:

	if (trace_sctp_probe_path_enabled()) {
		struct sctp_transport *sp;

		list_for_each_entry(sp, &asoc->peer.transpor_addr_list,
				    transports) {
			trace_sctp_probe_path(sp, asoc);
		}
	}

The "trace_sctp_probe_path_enabled()" is a static branch, which means it's a nop just like a tracepoint is, and will not add any overhead if the trace_sctp_probe_path is not enabled.

-- Steve

Quoted 4 lines
net/sctp/sm_statefuns.c +1 -0
+
 	if (!sctp_vtag_verify(chunk, asoc))
 		return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
 
author maintainer
#6 lore raw

Re: [v2 PATCH -tip 3/6] net: sctp: Add SCTP ACK tracking trace event

Quoted 59 lines · On Mon, 18 Dec 2017 12:05:16 -0500 Steven Rostedt <[email protected]> wrote:
Quoted 13 lines · On Mon, 18 Dec 2017 17:12:15 +0900 Masami Hiramatsu <[email protected]> wrote:

Add SCTP ACK tracking trace event to trace the changes of SCTP association state in response to incoming packets. It is used for debugging SCTP congestion control algorithms, and will replace sctp_probe module.

Note that this event a bit tricky. Since this consists of 2 events (sctp_probe and sctp_probe_path) so you have to enable both events as below.

  # cd /sys/kernel/debug/tracing
  # echo 1 > events/sctp/sctp_probe/enable
  # echo 1 > events/sctp/sctp_probe_path/enable
Quoted 7 lines

Or, you can enable all the events under sctp.

  # echo 1 > events/sctp/enable

Since sctp_probe_path event is always invoked from sctp_probe event, you can not see any output if you only enable sctp_probe_path.

I have to ask, why did you do it this way?

Quoted 16 lines
include/trace/events/sctp.h new file +1 -0
+#include <trace/define_trace.h>
net/sctp/sm_statefuns.c +3 -0
index 8f8ccded13e4..c5f92b2cc5c3 100644
@@ -59,6 +59,9 @@
 #include <net/sctp/sm.h>
 #include <net/sctp/structs.h>
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/sctp.h>
+
 static struct sctp_packet *sctp_abort_pkt_new(
 					struct net *net,
 					const struct sctp_endpoint *ep,

net/sctp/sm_statefuns.c enum sctp_disposition sctp_sf_eat_sack_6_2(struct net *net, · line 3225

Quoted 4 lines
net/sctp/sm_statefuns.c +1 -0
@@ -3219,6 +3222,8 @@ enum sctp_disposition sctp_sf_eat_sack_6_2(struct net *net,
 	struct sctp_sackhdr *sackh;
 	__u32 ctsn;
 
+	trace_sctp_probe(ep, asoc, chunk);

What about doing this right after this probe:

	if (trace_sctp_probe_path_enabled()) {
		struct sctp_transport *sp;

		list_for_each_entry(sp, &asoc->peer.transpor_addr_list,
				    transports) {
			trace_sctp_probe_path(sp, asoc);
		}
	}
Quoted 3 lines

The "trace_sctp_probe_path_enabled()" is a static branch, which means it's a nop just like a tracepoint is, and will not add any overhead if the trace_sctp_probe_path is not enabled.

That's a good idea! I'll update to use it :)

Thank you,

Quoted 8 lines

-- Steve

Quoted 4 lines
net/sctp/sm_statefuns.c +1 -0
+
 	if (!sctp_vtag_verify(chunk, asoc))
 		return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
 
Signature · 1 line
Masami Hiramatsu <[email protected]>
#7 lore raw

Re: [v2 PATCH -tip 3/6] net: sctp: Add SCTP ACK tracking trace event

In reply to Masami Hiramatsu
I love your patch! Perhaps something to improve:

Hi Masami,

I love your patch! Perhaps something to improve:

[auto build test WARNING on net/master]
[also build test WARNING on v4.15-rc4 next-20171219]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Masami-Hiramatsu/net-tcp-sctp-dccp-Replace-jprobe-usage-with-trace-events/20171220-081035
config: i386-randconfig-x011-201751 (attached as .config)
compiler: gcc-7 (Debian 7.2.0-12) 7.2.1 20171025 reproduce:

        # save the attached .config to linux build tree
        make ARCH=i386 

All warnings (new ones prefixed by >>):

In file included from include/trace/define_trace.h:96:0,

                    from include/trace/events/sctp.h:96,
                    from net//sctp/sm_statefuns.c:63:
   include/trace/events/sctp.h: In function 'trace_event_raw_event_sctp_probe_path':
>> include/trace/events/sctp.h:31:19: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
      __entry->asoc = (__u64)asoc;
                      ^
   include/trace/trace_events.h:719:4: note: in definition of macro 'DECLARE_EVENT_CLASS'
     { assign; }       \
       ^~~~~~
   include/trace/trace_events.h:78:9: note: in expansion of macro 'PARAMS'
            PARAMS(assign),         \
            ^~~~~~
>> include/trace/events/sctp.h:11:1: note: in expansion of macro 'TRACE_EVENT'
    TRACE_EVENT(sctp_probe_path,
    ^~~~~~~~~~~
>> include/trace/events/sctp.h:30:2: note: in expansion of macro 'TP_fast_assign'
     TP_fast_assign(
     ^~~~~~~~~~~~~~
   include/trace/events/sctp.h: In function 'trace_event_raw_event_sctp_probe':
   include/trace/events/sctp.h:72:19: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
      __entry->asoc = (__u64)asoc;
                      ^
   include/trace/trace_events.h:719:4: note: in definition of macro 'DECLARE_EVENT_CLASS'
     { assign; }       \
       ^~~~~~
   include/trace/trace_events.h:78:9: note: in expansion of macro 'PARAMS'
            PARAMS(assign),         \
            ^~~~~~
   include/trace/events/sctp.h:50:1: note: in expansion of macro 'TRACE_EVENT'
    TRACE_EVENT(sctp_probe,
    ^~~~~~~~~~~
   include/trace/events/sctp.h:68:2: note: in expansion of macro 'TP_fast_assign'
     TP_fast_assign(
     ^~~~~~~~~~~~~~
   In file included from include/trace/define_trace.h:97:0,
                    from include/trace/events/sctp.h:96,
                    from net//sctp/sm_statefuns.c:63:
   include/trace/events/sctp.h: In function 'perf_trace_sctp_probe_path':
>> include/trace/events/sctp.h:31:19: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
      __entry->asoc = (__u64)asoc;
                      ^
   include/trace/perf.h:66:4: note: in definition of macro 'DECLARE_EVENT_CLASS'
     { assign; }       \
       ^~~~~~
   include/trace/trace_events.h:78:9: note: in expansion of macro 'PARAMS'
            PARAMS(assign),         \
            ^~~~~~
>> include/trace/events/sctp.h:11:1: note: in expansion of macro 'TRACE_EVENT'
    TRACE_EVENT(sctp_probe_path,
    ^~~~~~~~~~~
>> include/trace/events/sctp.h:30:2: note: in expansion of macro 'TP_fast_assign'
     TP_fast_assign(
     ^~~~~~~~~~~~~~
   include/trace/events/sctp.h: In function 'perf_trace_sctp_probe':
   include/trace/events/sctp.h:72:19: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
      __entry->asoc = (__u64)asoc;
                      ^
   include/trace/perf.h:66:4: note: in definition of macro 'DECLARE_EVENT_CLASS'
     { assign; }       \
       ^~~~~~
   include/trace/trace_events.h:78:9: note: in expansion of macro 'PARAMS'
            PARAMS(assign),         \
            ^~~~~~
   include/trace/events/sctp.h:50:1: note: in expansion of macro 'TRACE_EVENT'
    TRACE_EVENT(sctp_probe,
    ^~~~~~~~~~~
   include/trace/events/sctp.h:68:2: note: in expansion of macro 'TP_fast_assign'
     TP_fast_assign(
     ^~~~~~~~~~~~~~

vim +31 include/trace/events/sctp.h

    10	
  > 11	TRACE_EVENT(sctp_probe_path,
    12	
    13		TP_PROTO(struct sctp_transport *sp,
    14			 const struct sctp_association *asoc),
    15	
    16		TP_ARGS(sp, asoc),
    17	
    18		TP_STRUCT__entry(
    19			__field(__u64, asoc)
    20			__field(__u32, primary)
    21			__array(__u8, ipaddr, sizeof(union sctp_addr))
    22			__field(__u32, state)
    23			__field(__u32, cwnd)
    24			__field(__u32, ssthresh)
    25			__field(__u32, flight_size)
    26			__field(__u32, partial_bytes_acked)
    27			__field(__u32, pathmtu)
    28		),
    29	
  > 30		TP_fast_assign(
  > 31			__entry->asoc = (__u64)asoc;
    32			__entry->primary = (sp == asoc->peer.primary_path);
    33			memcpy(__entry->ipaddr, &sp->ipaddr, sizeof(union sctp_addr));
    34			__entry->state = sp->state;
    35			__entry->cwnd = sp->cwnd;
    36			__entry->ssthresh = sp->ssthresh;
    37			__entry->flight_size = sp->flight_size;
    38			__entry->partial_bytes_acked = sp->partial_bytes_acked;
    39			__entry->pathmtu = sp->pathmtu;
    40		),
    41	
    42		TP_printk("asoc=%#llx%s ipaddr=%pISpc state=%u cwnd=%u ssthresh=%u "
    43			  "flight_size=%u partial_bytes_acked=%u pathmtu=%u",
    44			  __entry->asoc, __entry->primary ? "(*)" : "",
    45			  __entry->ipaddr, __entry->state, __entry->cwnd,
    46			  __entry->ssthresh, __entry->flight_size,
    47			  __entry->partial_bytes_acked, __entry->pathmtu)
    48	);
    49	
    50	TRACE_EVENT(sctp_probe,
    51	
    52		TP_PROTO(const struct sctp_endpoint *ep,
    53			 const struct sctp_association *asoc,
    54			 struct sctp_chunk *chunk),
    55	
    56		TP_ARGS(ep, asoc, chunk),
    57	
    58		TP_STRUCT__entry(
    59			__field(__u64, asoc)
    60			__field(__u32, mark)
    61			__field(__u16, bind_port)
    62			__field(__u16, peer_port)
    63			__field(__u32, pathmtu)
    64			__field(__u32, rwnd)
    65			__field(__u16, unack_data)
    66		),
    67	
    68		TP_fast_assign(
    69			struct sctp_transport *sp;
    70			struct sk_buff *skb = chunk->skb;
    71	
    72			__entry->asoc = (__u64)asoc;
    73			__entry->mark = skb->mark;
    74			__entry->bind_port = ep->base.bind_addr.port;
    75			__entry->peer_port = asoc->peer.port;
    76			__entry->pathmtu = asoc->pathmtu;
    77			__entry->rwnd = asoc->peer.rwnd;
    78			__entry->unack_data = asoc->unack_data;
    79	
    80			list_for_each_entry(sp, &asoc->peer.transport_addr_list,
    81					    transports) {
    82				trace_sctp_probe_path(sp, asoc);
    83			}
    84		),
    85	
    86		TP_printk("asoc=%#llx mark=%#x bind_port=%d peer_port=%d pathmtu=%d "
    87			  "rwnd=%u unack_data=%d",
    88			  __entry->asoc, __entry->mark, __entry->bind_port,
    89			  __entry->peer_port, __entry->pathmtu, __entry->rwnd,
    90			  __entry->unack_data)
    91	);
    92	
    93	#endif /* _TRACE_SCTP_H */
    94	
    95	/* This part must be outside protection */
  > 96	#include <trace/define_trace.h>

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

author maintainer
#8 lore raw

PATCH v2 4/6 net: sctp: Remove debug SCTP probe module

In reply to Masami Hiramatsu

Remove SCTP probe module since jprobe has been deprecated. That function is now replaced by sctp/sctp_probe and sctp/sctp_probe_path trace-events.
You can use it via ftrace or perftools.

---
 net/sctp/Kconfig  |   12 ---
 net/sctp/Makefile |    3 -
 net/sctp/probe.c  |  244 -----------------------------------------------------
 3 files changed, 259 deletions(-)
 delete mode 100644 net/sctp/probe.c
net/sctp/Kconfig +0 -12
index d9c04dc1b3f3..c740b189d4ba 100644
@@ -37,18 +37,6 @@ menuconfig IP_SCTP
 
 if IP_SCTP
 
-config NET_SCTPPROBE
-	tristate "SCTP: Association probing"
-        depends on PROC_FS && KPROBES
-        ---help---
-        This module allows for capturing the changes to SCTP association
-        state in response to incoming packets. It is used for debugging
-        SCTP congestion control algorithms. If you don't understand
-        what was just said, you don't need it: say N.
-
-        To compile this code as a module, choose M here: the
-        module will be called sctp_probe.
-
 config SCTP_DBG_OBJCNT
 	bool "SCTP: Debug object counts"
 	depends on PROC_FS
net/sctp/Makefile +0 -3
index 1ca84a288443..b52dfc6f8b4c 100644
@@ -4,7 +4,6 @@
 #
 
 obj-$(CONFIG_IP_SCTP) += sctp.o
-obj-$(CONFIG_NET_SCTPPROBE) += sctp_probe.o
 obj-$(CONFIG_INET_SCTP_DIAG) += sctp_diag.o
 
 sctp-y := sm_statetable.o sm_statefuns.o sm_sideeffect.o \
@@ -16,8 +15,6 @@ sctp-y := sm_statetable.o sm_statefuns.o sm_sideeffect.o \
 	  offload.o stream_sched.o stream_sched_prio.o \
 	  stream_sched_rr.o
 
-sctp_probe-y := probe.o
-
 sctp-$(CONFIG_SCTP_DBG_OBJCNT) += objcnt.o
 sctp-$(CONFIG_PROC_FS) += proc.o
 sctp-$(CONFIG_SYSCTL) += sysctl.o
net/sctp/probe.c deleted +0 -244

244 lines not on this page · raw message

author maintainer
#9 lore raw

PATCH v2 5/6 net: dccp: Add DCCP sendmsg trace event

In reply to Masami Hiramatsu

Add DCCP sendmsg trace event (dccp/dccp_probe) for replacing dccpprobe. User can trace this event via ftrace or perftools.

---
 net/dccp/proto.c |    5 +++
 net/dccp/trace.h |  105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 110 insertions(+)
 create mode 100644 net/dccp/trace.h
net/dccp/proto.c +5 -0
index 9d43c1f40274..e57b5db495cd 100644
@@ -38,6 +38,9 @@
 #include "dccp.h"
 #include "feat.h"
 
+#define CREATE_TRACE_POINTS
+#include "trace.h"
+
 DEFINE_SNMP_STAT(struct dccp_mib, dccp_statistics) __read_mostly;
 
 EXPORT_SYMBOL_GPL(dccp_statistics);
@@ -761,6 +764,8 @@ int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
 	int rc, size;
 	long timeo;
 
+	trace_dccp_probe(sk, len);
+
 	if (len > dp->dccps_mss_cache)
 		return -EMSGSIZE;
 
net/dccp/trace.h new file +105 -0

105 lines not on this page · raw message

author maintainer
#10 lore raw

PATCH v2 6/6 net: dccp: Remove dccpprobe module

In reply to Masami Hiramatsu

Remove DCCP probe module since jprobe has been deprecated. That function is now replaced by dccp/dccp_probe trace-event. You can use it via ftrace or perftools.

---
 net/dccp/Kconfig  |   17 ----
 net/dccp/Makefile |    2 -
 net/dccp/probe.c  |  203 -----------------------------------------------------
 3 files changed, 222 deletions(-)
 delete mode 100644 net/dccp/probe.c
net/dccp/Kconfig +0 -17
index 8c0ef71bed2f..b270e84d9c13 100644
@@ -39,23 +39,6 @@ config IP_DCCP_DEBUG
 
 	  Just say N.
 
-config NET_DCCPPROBE
-	tristate "DCCP connection probing"
-	depends on PROC_FS && KPROBES
-	---help---
-	This module allows for capturing the changes to DCCP connection
-	state in response to incoming packets. It is used for debugging
-	DCCP congestion avoidance modules. If you don't understand
-	what was just said, you don't need it: say N.
-
-	Documentation on how to use DCCP connection probing can be found
-	at:
-	
-	  http://www.linuxfoundation.org/collaborate/workgroups/networking/dccpprobe
-
-	To compile this code as a module, choose M here: the
-	module will be called dccp_probe.
-
 
 endmenu
 
net/dccp/Makefile +0 -2
index 2e7b56097bc4..9d0383d2f277 100644
@@ -21,9 +21,7 @@ obj-$(subst y,$(CONFIG_IP_DCCP),$(CONFIG_IPV6)) += dccp_ipv6.o
 dccp_ipv6-y := ipv6.o
 
 obj-$(CONFIG_INET_DCCP_DIAG) += dccp_diag.o
-obj-$(CONFIG_NET_DCCPPROBE) += dccp_probe.o
 
 dccp-$(CONFIG_SYSCTL) += sysctl.o
 
 dccp_diag-y := diag.o
-dccp_probe-y := probe.o
net/dccp/probe.c deleted +0 -203

203 lines not on this page · raw message

author maintainer
#11 lore raw
In reply to Masami Hiramatsu

Oops, I found a build error for tcp.h

I'll update it.

Quoted 102 lines · On Mon, 18 Dec 2017 17:10:45 +0900 Masami Hiramatsu <[email protected]> wrote:

Hi,.

This series is v2 of the replacement of jprobe usage with trace events, and is just rebased on current tip/master branch.

Please review it and test it.
Anyway, this removes all {tcp,sctp,dccp}_probe.ko because those depend on jprobe.

This introduce new trace events which allows user to trace network congestion window etc. via ftrace or perftools. And remove jprobe usages (tcp_probe/dccp_probe/sctp_probe). So this series removes all register_jprobe users from the kernel tree.

So following example in

https://wiki.linuxfoundation.org/networking/tcpprobe

 # modprobe tcp_probe portP01
 # cat /proc/net/tcpprobe >/tmp/data.out &
 # pid=$!
 # iperf -c otherhost
 # kill $pid

will be changed as below;

 # cd <debugfs or tracefs>/tracing
 # echo 1 > events/tcp/tcp_probe/enable
 # echo "sport = 5001 || dport = 5001"  > events/tcp/tcp_probe/filter
 # tail -f trace_pipe > /tmp/data.out &
 # pid=$!
 # iperf -c otherhost
 # kill $pid

And it outouts logs lile below;

# tracer: nop
#
# _-----=> irqs-off
# / _----=> need-resched

#                            | / _---=> hardirq/softirq
#                            || / _--=> preempt-depth
#                            ||| /     delay
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
#              | |       |   ||||       |         |
          <idle>-0     [000] ..s2  1089.238049: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length7 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(960
          <idle>-0     [000] ..s2  1090.156938: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length7 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(992
          <idle>-0     [000] ..s2  1091.333729: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length8 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(992
          <idle>-0     [000] ..s2  1092.300330: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length7 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(992
          <idle>-0     [000] ..s2  1095.044739: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length6 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(992
          <idle>-0     [000] ..s2  1096.573825: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length2 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd ssthresh!47483647 snd_wnd)312 srttG8 rcv_wnd(992

I need your feedback for this change, like formatting etc. Also, I need more test for this events by who can setup DCCP and SCTP, since those are special protocols, I have no environment to test it.

Steve, I also wrote a hack in sctp_probe event. In that event it calls trace_sctp_probe_path() directly and record it. This means an event invokes another event inside. As far as I can see, that seems OK.
But I need your review too.

Thank you,

---

Masami Hiramatsu (6):
net: tcp: Add trace events for TCP congestion window tracing
net: tcp: Remove TCP probe module
net: sctp: Add SCTP ACK tracking trace event
net: sctp: Remove debug SCTP probe module
net: dccp: Add DCCP sendmsg trace event
net: dccp: Remove dccpprobe module

 include/trace/events/sctp.h |   96 ++++++++++++++
 include/trace/events/tcp.h  |   86 ++++++++++++
 net/Kconfig                 |   17 --
 net/core/net-traces.c       |    1 
 net/dccp/Kconfig            |   17 --
 net/dccp/Makefile           |    2 
 net/dccp/probe.c            |  203 -----------------------------
 net/dccp/proto.c            |    5 +
 net/dccp/trace.h            |  105 +++++++++++++++
 net/ipv4/Makefile           |    1 
 net/ipv4/tcp_input.c        |    3 
 net/ipv4/tcp_probe.c        |  301 -------------------------------------------
 net/sctp/Kconfig            |   12 --
 net/sctp/Makefile           |    3 
 net/sctp/probe.c            |  244 -----------------------------------
 net/sctp/sm_statefuns.c     |    5 +
 16 files changed, 301 insertions(+), 800 deletions(-)
 create mode 100644 include/trace/events/sctp.h
 delete mode 100644 net/dccp/probe.c
 create mode 100644 net/dccp/trace.h
 delete mode 100644 net/ipv4/tcp_probe.c
 delete mode 100644 net/sctp/probe.c

--
Masami Hiramatsu (Linaro) <[email protected]>

Signature · 1 line
Masami Hiramatsu <[email protected]>