1 From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
2 Subject: LTTng instrumentation - socket
5 LTTng instrumentation - socket
7 Instrument socket creation and activity (msg send, receive). Socket "call"
8 instrumentation should be completed.
10 Those tracepoints are used by LTTng.
12 About the performance impact of tracepoints (which is comparable to markers),
13 even without immediate values optimizations, tests done by Hideo Aoki on ia64
14 show no regression. His test case was using hackbench on a kernel where
15 scheduler instrumentation (about 5 events in code scheduler code) was added.
16 See the "Tracepoints" patch header for performance result detail.
18 Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
19 CC: netdev@vger.kernel.org
20 CC: David S. Miller <davem@davemloft.net>
21 CC: Masami Hiramatsu <mhiramat@redhat.com>
22 CC: 'Peter Zijlstra' <peterz@infradead.org>
23 CC: "Frank Ch. Eigler" <fche@redhat.com>
24 CC: 'Ingo Molnar' <mingo@elte.hu>
25 CC: 'Hideo AOKI' <haoki@redhat.com>
26 CC: Takashi Nishiie <t-nishiie@np.css.fujitsu.com>
27 CC: 'Steven Rostedt' <rostedt@goodmis.org>
28 CC: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
30 Acked-by: Jan Blunck <jblunck@suse.de>
33 include/trace/socket.h | 26 ++++++++++++++++++++++++++
34 net/socket.c | 7 +++++++
35 2 files changed, 33 insertions(+)
38 +++ b/include/trace/socket.h
40 +#ifndef _TRACE_SOCKET_H
41 +#define _TRACE_SOCKET_H
43 +#include <net/sock.h>
44 +#include <linux/tracepoint.h>
46 +DEFINE_TRACE(socket_sendmsg,
47 + TPPROTO(struct socket *sock, struct msghdr *msg, size_t size, int ret),
48 + TPARGS(sock, msg, size, ret));
49 +DEFINE_TRACE(socket_recvmsg,
50 + TPPROTO(struct socket *sock, struct msghdr *msg, size_t size, int flags,
52 + TPARGS(sock, msg, size, flags, ret));
53 +DEFINE_TRACE(socket_create,
54 + TPPROTO(struct socket *sock, int fd),
59 + * TODO : This tracepoint should be expanded to cover each element of the
60 + * switch in sys_socketcall().
62 +DEFINE_TRACE(socket_call,
63 + TPPROTO(int call, unsigned long a0),
71 #include <linux/netfilter.h>
72 +#include <trace/socket.h>
74 static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
75 static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
76 @@ -575,6 +576,7 @@ int sock_sendmsg(struct socket *sock, st
77 ret = __sock_sendmsg(&iocb, sock, msg, size);
78 if (-EIOCBQUEUED == ret)
79 ret = wait_on_sync_kiocb(&iocb);
80 + trace_socket_sendmsg(sock, msg, size, ret);
84 @@ -654,10 +656,12 @@ int sock_recvmsg(struct socket *sock, st
87 init_sync_kiocb(&iocb, NULL);
89 iocb.private = &siocb;
90 ret = __sock_recvmsg(&iocb, sock, msg, size, flags);
91 if (-EIOCBQUEUED == ret)
92 ret = wait_on_sync_kiocb(&iocb);
93 + trace_socket_recvmsg(sock, msg, size, flags, ret);
97 @@ -1244,6 +1248,7 @@ SYSCALL_DEFINE3(socket, int, family, int
101 + trace_socket_create(sock, retval);
103 /* It may be already another descriptor 8) Not kernel problem. */
105 @@ -2131,6 +2136,8 @@ SYSCALL_DEFINE2(socketcall, int, call, u
109 + trace_socket_call(call, a0);
113 err = sys_socket(a0, a1, a[2]);