]>
Commit | Line | Data |
---|---|---|
00e5a55c BS |
1 | From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> |
2 | Subject: LTTng instrumentation - socket | |
3 | ||
4 | Original patch header: | |
5 | LTTng instrumentation - socket | |
6 | ||
7 | Instrument socket creation and activity (msg send, receive). Socket "call" | |
8 | instrumentation should be completed. | |
9 | ||
10 | Those tracepoints are used by LTTng. | |
11 | ||
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. | |
17 | ||
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> | |
29 | ||
30 | Acked-by: Jan Blunck <jblunck@suse.de> | |
31 | --- | |
32 | --- | |
33 | include/trace/socket.h | 26 ++++++++++++++++++++++++++ | |
34 | net/socket.c | 7 +++++++ | |
35 | 2 files changed, 33 insertions(+) | |
36 | ||
37 | --- /dev/null | |
38 | +++ b/include/trace/socket.h | |
39 | @@ -0,0 +1,26 @@ | |
40 | +#ifndef _TRACE_SOCKET_H | |
41 | +#define _TRACE_SOCKET_H | |
42 | + | |
43 | +#include <net/sock.h> | |
44 | +#include <linux/tracepoint.h> | |
45 | + | |
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, | |
51 | + int ret), | |
52 | + TPARGS(sock, msg, size, flags, ret)); | |
53 | +DEFINE_TRACE(socket_create, | |
54 | + TPPROTO(struct socket *sock, int fd), | |
55 | + TPARGS(sock, fd)); | |
56 | +/* | |
57 | + * socket_call | |
58 | + * | |
59 | + * TODO : This tracepoint should be expanded to cover each element of the | |
60 | + * switch in sys_socketcall(). | |
61 | + */ | |
62 | +DEFINE_TRACE(socket_call, | |
63 | + TPPROTO(int call, unsigned long a0), | |
64 | + TPARGS(call, a0)); | |
65 | +#endif | |
66 | --- a/net/socket.c | |
67 | +++ b/net/socket.c | |
68 | @@ -96,6 +96,7 @@ | |
69 | ||
70 | #include <net/sock.h> | |
71 | #include <linux/netfilter.h> | |
72 | +#include <trace/socket.h> | |
73 | ||
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); | |
81 | return ret; | |
82 | } | |
83 | ||
84 | @@ -654,10 +656,12 @@ int sock_recvmsg(struct socket *sock, st | |
85 | int ret; | |
86 | ||
87 | init_sync_kiocb(&iocb, NULL); | |
88 | + | |
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); | |
94 | return ret; | |
95 | } | |
96 | ||
97 | @@ -1244,6 +1248,7 @@ SYSCALL_DEFINE3(socket, int, family, int | |
98 | if (retval < 0) | |
99 | goto out_release; | |
100 | ||
101 | + trace_socket_create(sock, retval); | |
102 | out: | |
103 | /* It may be already another descriptor 8) Not kernel problem. */ | |
104 | return retval; | |
105 | @@ -2131,6 +2136,8 @@ SYSCALL_DEFINE2(socketcall, int, call, u | |
106 | a0 = a[0]; | |
107 | a1 = a[1]; | |
108 | ||
109 | + trace_socket_call(call, a0); | |
110 | + | |
111 | switch (call) { | |
112 | case SYS_SOCKET: | |
113 | err = sys_socket(a0, a1, a[2]); |