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 port=5001
# 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 length=37 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28960
<idle>-0 [000] ..s2 1090.156938: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length=37 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28992
<idle>-0 [000] ..s2 1091.333729: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length=38 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28992
<idle>-0 [000] ..s2 1092.300330: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length=37 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28992
<idle>-0 [000] ..s2 1095.044739: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length=36 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28992
<idle>-0 [000] ..s2 1096.573825: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length=32 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28992
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) [off-list ref]
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
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
include/trace/events/tcp.h | 86 ++++++++++++++++++++++++++++++++++++++++++++
net/core/net-traces.c | 1 +
net/ipv4/tcp_input.c | 3 ++
3 files changed, 90 insertions(+)
@@ -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(structsock*sk,structsk_buff*skb),++TP_ARGS(sk,skb),++TP_STRUCT__entry(+/* sockaddr_in6 is always bigger than sockaddr_in */+__array(__u8,saddr,sizeof(structsockaddr_in6))+__array(__u8,daddr,sizeof(structsockaddr_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(+conststructtcp_sock*tp=tcp_sk(sk);+conststructinet_sock*inet=inet_sk(sk);++memset(__entry->saddr,0,sizeof(structsockaddr_in6));+memset(__entry->daddr,0,sizeof(structsockaddr_in6));++if(sk->sk_family==AF_INET){+structsockaddr_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)+}elseif(sk->sk_family==AF_INET6){+structsockaddr_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 */
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.
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
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
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.
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
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
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.
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
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
@@ -1,244 +0,0 @@-/*- * sctp_probe - Observe the SCTP flow with kprobes.- *- * The idea for this came from Werner Almesberger's umlsim- * Copyright (C) 2004, Stephen Hemminger <shemminger@osdl.org>- *- * Modified for SCTP from Stephen Hemminger's code- * Copyright (C) 2010, Wei Yongjun <yjwei@cn.fujitsu.com>- *- * This program is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License as published by- * the Free Software Foundation; either version 2 of the License, or- * (at your option) any later version.- *- * This program is distributed in the hope that it will be useful,- * but WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the- * GNU General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; if not, write to the Free Software- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.- */--#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt--#include <linux/kernel.h>-#include <linux/kprobes.h>-#include <linux/socket.h>-#include <linux/sctp.h>-#include <linux/proc_fs.h>-#include <linux/vmalloc.h>-#include <linux/module.h>-#include <linux/kfifo.h>-#include <linux/time.h>-#include <net/net_namespace.h>--#include <net/sctp/sctp.h>-#include <net/sctp/sm.h>--MODULE_SOFTDEP("pre: sctp");-MODULE_AUTHOR("Wei Yongjun <yjwei@cn.fujitsu.com>");-MODULE_DESCRIPTION("SCTP snooper");-MODULE_LICENSE("GPL");--static int port __read_mostly = 0;-MODULE_PARM_DESC(port, "Port to match (0=all)");-module_param(port, int, 0);--static unsigned int fwmark __read_mostly = 0;-MODULE_PARM_DESC(fwmark, "skb mark to match (0=no mark)");-module_param(fwmark, uint, 0);--static int bufsize __read_mostly = 64 * 1024;-MODULE_PARM_DESC(bufsize, "Log buffer size (default 64k)");-module_param(bufsize, int, 0);--static int full __read_mostly = 1;-MODULE_PARM_DESC(full, "Full log (1=every ack packet received, 0=only cwnd changes)");-module_param(full, int, 0);--static const char procname[] = "sctpprobe";--static struct {- struct kfifo fifo;- spinlock_t lock;- wait_queue_head_t wait;- struct timespec64 tstart;-} sctpw;--static __printf(1, 2) void printl(const char *fmt, ...)-{- va_list args;- int len;- char tbuf[256];-- va_start(args, fmt);- len = vscnprintf(tbuf, sizeof(tbuf), fmt, args);- va_end(args);-- kfifo_in_locked(&sctpw.fifo, tbuf, len, &sctpw.lock);- wake_up(&sctpw.wait);-}--static int sctpprobe_open(struct inode *inode, struct file *file)-{- kfifo_reset(&sctpw.fifo);- ktime_get_ts64(&sctpw.tstart);-- return 0;-}--static ssize_t sctpprobe_read(struct file *file, char __user *buf,- size_t len, loff_t *ppos)-{- int error = 0, cnt = 0;- unsigned char *tbuf;-- if (!buf)- return -EINVAL;-- if (len == 0)- return 0;-- tbuf = vmalloc(len);- if (!tbuf)- return -ENOMEM;-- error = wait_event_interruptible(sctpw.wait,- kfifo_len(&sctpw.fifo) != 0);- if (error)- goto out_free;-- cnt = kfifo_out_locked(&sctpw.fifo, tbuf, len, &sctpw.lock);- error = copy_to_user(buf, tbuf, cnt) ? -EFAULT : 0;--out_free:- vfree(tbuf);-- return error ? error : cnt;-}--static const struct file_operations sctpprobe_fops = {- .owner = THIS_MODULE,- .open = sctpprobe_open,- .read = sctpprobe_read,- .llseek = noop_llseek,-};--static enum sctp_disposition jsctp_sf_eat_sack(- struct net *net,- const struct sctp_endpoint *ep,- const struct sctp_association *asoc,- const union sctp_subtype type,- void *arg,- struct sctp_cmd_seq *commands)-{- struct sctp_chunk *chunk = arg;- struct sk_buff *skb = chunk->skb;- struct sctp_transport *sp;- static __u32 lcwnd = 0;- struct timespec64 now;-- sp = asoc->peer.primary_path;-- if (((port == 0 && fwmark == 0) ||- asoc->peer.port == port ||- ep->base.bind_addr.port == port ||- (fwmark > 0 && skb->mark == fwmark)) &&- (full || sp->cwnd != lcwnd)) {- lcwnd = sp->cwnd;-- ktime_get_ts64(&now);- now = timespec64_sub(now, sctpw.tstart);-- printl("%lu.%06lu ", (unsigned long) now.tv_sec,- (unsigned long) now.tv_nsec / NSEC_PER_USEC);-- printl("%p %5d %5d %5d %8d %5d ", asoc,- ep->base.bind_addr.port, asoc->peer.port,- asoc->pathmtu, asoc->peer.rwnd, asoc->unack_data);-- list_for_each_entry(sp, &asoc->peer.transport_addr_list,- transports) {- if (sp == asoc->peer.primary_path)- printl("*");-- printl("%pISc %2u %8u %8u %8u %8u %8u ",- &sp->ipaddr, sp->state, sp->cwnd, sp->ssthresh,- sp->flight_size, sp->partial_bytes_acked,- sp->pathmtu);- }- printl("\n");- }-- jprobe_return();- return 0;-}--static struct jprobe sctp_recv_probe = {- .kp = {- .symbol_name = "sctp_sf_eat_sack_6_2",- },- .entry = jsctp_sf_eat_sack,-};--static __init int sctp_setup_jprobe(void)-{- int ret = register_jprobe(&sctp_recv_probe);-- if (ret) {- if (request_module("sctp"))- goto out;- ret = register_jprobe(&sctp_recv_probe);- }--out:- return ret;-}--static __init int sctpprobe_init(void)-{- int ret = -ENOMEM;-- /* Warning: if the function signature of sctp_sf_eat_sack_6_2,- * has been changed, you also have to change the signature of- * jsctp_sf_eat_sack, otherwise you end up right here!- */- BUILD_BUG_ON(__same_type(sctp_sf_eat_sack_6_2,- jsctp_sf_eat_sack) == 0);-- init_waitqueue_head(&sctpw.wait);- spin_lock_init(&sctpw.lock);- if (kfifo_alloc(&sctpw.fifo, bufsize, GFP_KERNEL))- return ret;-- if (!proc_create(procname, S_IRUSR, init_net.proc_net,- &sctpprobe_fops))- goto free_kfifo;-- ret = sctp_setup_jprobe();- if (ret)- goto remove_proc;-- pr_info("probe registered (port=%d/fwmark=%u) bufsize=%u\n",- port, fwmark, bufsize);- return 0;--remove_proc:- remove_proc_entry(procname, init_net.proc_net);-free_kfifo:- kfifo_free(&sctpw.fifo);- return ret;-}--static __exit void sctpprobe_exit(void)-{- kfifo_free(&sctpw.fifo);- remove_proc_entry(procname, init_net.proc_net);- unregister_jprobe(&sctp_recv_probe);-}--module_init(sctpprobe_init);-module_exit(sctpprobe_exit);
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.
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
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
@@ -1,203 +0,0 @@-/*- * dccp_probe - Observe the DCCP flow with kprobes.- *- * The idea for this came from Werner Almesberger's umlsim- * Copyright (C) 2004, Stephen Hemminger <shemminger@osdl.org>- *- * Modified for DCCP from Stephen Hemminger's code- * Copyright (C) 2006, Ian McDonald <ian.mcdonald@jandi.co.nz>- *- * This program is free software; you can redistribute it and/or modify- * it under the terms of the GNU General Public License as published by- * the Free Software Foundation; either version 2 of the License, or- * (at your option) any later version.- *- * This program is distributed in the hope that it will be useful,- * but WITHOUT ANY WARRANTY; without even the implied warranty of- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the- * GNU General Public License for more details.- *- * You should have received a copy of the GNU General Public License- * along with this program; if not, write to the Free Software- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.- */--#include <linux/kernel.h>-#include <linux/kprobes.h>-#include <linux/socket.h>-#include <linux/dccp.h>-#include <linux/proc_fs.h>-#include <linux/module.h>-#include <linux/kfifo.h>-#include <linux/vmalloc.h>-#include <linux/time64.h>-#include <linux/gfp.h>-#include <net/net_namespace.h>--#include "dccp.h"-#include "ccid.h"-#include "ccids/ccid3.h"--static int port;--static int bufsize = 64 * 1024;--static const char procname[] = "dccpprobe";--static struct {- struct kfifo fifo;- spinlock_t lock;- wait_queue_head_t wait;- struct timespec64 tstart;-} dccpw;--static void printl(const char *fmt, ...)-{- va_list args;- int len;- struct timespec64 now;- char tbuf[256];-- va_start(args, fmt);- getnstimeofday64(&now);-- now = timespec64_sub(now, dccpw.tstart);-- len = sprintf(tbuf, "%lu.%06lu ",- (unsigned long) now.tv_sec,- (unsigned long) now.tv_nsec / NSEC_PER_USEC);- len += vscnprintf(tbuf+len, sizeof(tbuf)-len, fmt, args);- va_end(args);-- kfifo_in_locked(&dccpw.fifo, tbuf, len, &dccpw.lock);- wake_up(&dccpw.wait);-}--static int jdccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)-{- const struct inet_sock *inet = inet_sk(sk);- struct ccid3_hc_tx_sock *hc = NULL;-- if (ccid_get_current_tx_ccid(dccp_sk(sk)) == DCCPC_CCID3)- hc = ccid3_hc_tx_sk(sk);-- if (port == 0 || ntohs(inet->inet_dport) == port ||- ntohs(inet->inet_sport) == port) {- if (hc)- printl("%pI4:%u %pI4:%u %d %d %d %d %u %llu %llu %d\n",- &inet->inet_saddr, ntohs(inet->inet_sport),- &inet->inet_daddr, ntohs(inet->inet_dport), size,- hc->tx_s, hc->tx_rtt, hc->tx_p,- hc->tx_x_calc, hc->tx_x_recv >> 6,- hc->tx_x >> 6, hc->tx_t_ipi);- else- printl("%pI4:%u %pI4:%u %d\n",- &inet->inet_saddr, ntohs(inet->inet_sport),- &inet->inet_daddr, ntohs(inet->inet_dport),- size);- }-- jprobe_return();- return 0;-}--static struct jprobe dccp_send_probe = {- .kp = {- .symbol_name = "dccp_sendmsg",- },- .entry = jdccp_sendmsg,-};--static int dccpprobe_open(struct inode *inode, struct file *file)-{- kfifo_reset(&dccpw.fifo);- getnstimeofday64(&dccpw.tstart);- return 0;-}--static ssize_t dccpprobe_read(struct file *file, char __user *buf,- size_t len, loff_t *ppos)-{- int error = 0, cnt = 0;- unsigned char *tbuf;-- if (!buf)- return -EINVAL;-- if (len == 0)- return 0;-- tbuf = vmalloc(len);- if (!tbuf)- return -ENOMEM;-- error = wait_event_interruptible(dccpw.wait,- kfifo_len(&dccpw.fifo) != 0);- if (error)- goto out_free;-- cnt = kfifo_out_locked(&dccpw.fifo, tbuf, len, &dccpw.lock);- error = copy_to_user(buf, tbuf, cnt) ? -EFAULT : 0;--out_free:- vfree(tbuf);-- return error ? error : cnt;-}--static const struct file_operations dccpprobe_fops = {- .owner = THIS_MODULE,- .open = dccpprobe_open,- .read = dccpprobe_read,- .llseek = noop_llseek,-};--static __init int dccpprobe_init(void)-{- int ret = -ENOMEM;-- init_waitqueue_head(&dccpw.wait);- spin_lock_init(&dccpw.lock);- if (kfifo_alloc(&dccpw.fifo, bufsize, GFP_KERNEL))- return ret;- if (!proc_create(procname, S_IRUSR, init_net.proc_net, &dccpprobe_fops))- goto err0;-- ret = register_jprobe(&dccp_send_probe);- if (ret) {- ret = request_module("dccp");- if (!ret)- ret = register_jprobe(&dccp_send_probe);- }-- if (ret)- goto err1;-- pr_info("DCCP watch registered (port=%d)\n", port);- return 0;-err1:- remove_proc_entry(procname, init_net.proc_net);-err0:- kfifo_free(&dccpw.fifo);- return ret;-}-module_init(dccpprobe_init);--static __exit void dccpprobe_exit(void)-{- kfifo_free(&dccpw.fifo);- remove_proc_entry(procname, init_net.proc_net);- unregister_jprobe(&dccp_send_probe);--}-module_exit(dccpprobe_exit);--MODULE_PARM_DESC(port, "Port to match (0=all)");-module_param(port, int, 0);--MODULE_PARM_DESC(bufsize, "Log buffer size (default 64k)");-module_param(bufsize, int, 0);--MODULE_AUTHOR("Ian McDonald <ian.mcdonald@jandi.co.nz>");-MODULE_DESCRIPTION("DCCP snooper");-MODULE_LICENSE("GPL");
From: Steven Rostedt <rostedt@goodmis.org> Date: 2017-12-18 17:05:28
On Mon, 18 Dec 2017 17:12:15 +0900
Masami Hiramatsu [off-list ref] 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
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.
@@ -3219,6 +3222,8 @@ enum sctp_disposition sctp_sf_eat_sack_6_2(struct net *net,structsctp_sackhdr*sackh;__u32ctsn;+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
On Mon, 18 Dec 2017 12:05:16 -0500
Steven Rostedt [off-list ref] wrote:
On Mon, 18 Dec 2017 17:12:15 +0900
Masami Hiramatsu [off-list ref] wrote:
quoted
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.
@@ -3219,6 +3222,8 @@ enum sctp_disposition sctp_sf_eat_sack_6_2(struct net *net,structsctp_sackhdr*sackh;__u32ctsn;+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.
That's a good idea! I'll update to use it :)
Thank you,
Oops, I found a build error for tcp.h
I'll update it.
On Mon, 18 Dec 2017 17:10:45 +0900
Masami Hiramatsu [off-list ref] 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 port=5001
# 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 length=37 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28960
<idle>-0 [000] ..s2 1090.156938: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length=37 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28992
<idle>-0 [000] ..s2 1091.333729: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length=38 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28992
<idle>-0 [000] ..s2 1092.300330: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length=37 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28992
<idle>-0 [000] ..s2 1095.044739: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length=36 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28992
<idle>-0 [000] ..s2 1096.573825: tcp_probe: src=[::ffff:192.168.139.2]:5001 dest=[::ffff:192.168.139.1]:56256 mark=0x0 length=32 snd_nxt=0xee4abe9c snd_una=0xee4abe9c snd_cwnd=10 ssthresh=2147483647 snd_wnd=29312 srtt=478 rcv_wnd=28992
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) [off-list ref]
From: kbuild test robot <hidden> Date: 2017-12-20 00:49:34
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':
quoted
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), \
^~~~~~
quoted
include/trace/events/sctp.h:11:1: note: in expansion of macro 'TRACE_EVENT'
TRACE_EVENT(sctp_probe_path,
^~~~~~~~~~~
quoted
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':
quoted
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), \
^~~~~~
quoted
include/trace/events/sctp.h:11:1: note: in expansion of macro 'TRACE_EVENT'
TRACE_EVENT(sctp_probe_path,
^~~~~~~~~~~
quoted
include/trace/events/sctp.h:30:2: note: in expansion of macro 'TP_fast_assign'
From: kbuild test robot <hidden> Date: 2017-12-20 01:45:20
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:
quoted
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
^~~~
quoted
include/linux/tracepoint.h:237:20: error: redefinition of '__tpstrtab_tcp_retransmit_skb'
static const char __tpstrtab_##name[] \
^
quoted
include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
include/trace/define_trace.h:51:2: note: in expansion of macro 'DEFINE_TRACE'
DEFINE_TRACE(name)
^~~~~~~~~~~~
quoted
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[] \
^
quoted
include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
include/trace/define_trace.h:51:2: note: in expansion of macro 'DEFINE_TRACE'
DEFINE_TRACE(name)
^~~~~~~~~~~~
quoted
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 \
^
quoted
include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
include/trace/define_trace.h:51:2: note: in expansion of macro 'DEFINE_TRACE'
DEFINE_TRACE(name)
^~~~~~~~~~~~
quoted
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 \
^
quoted
include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
include/trace/define_trace.h:51:2: note: in expansion of macro 'DEFINE_TRACE'
DEFINE_TRACE(name)
^~~~~~~~~~~~
quoted
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 \
^
quoted
include/linux/tracepoint.h:247:2: note: in expansion of macro 'DEFINE_TRACE_FN'
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 [off-list ref]
:::::: CC: David S. Miller [off-list ref]
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation