diff options
author | Jason Baron <jbaron@redhat.com> | 2009-08-10 16:52:53 -0400 |
---|---|---|
committer | Frederic Weisbecker <fweisbec@gmail.com> | 2009-08-11 14:35:28 -0400 |
commit | 64c12e0444fcc6b75eb49144ba46d43dbdc6bc8f (patch) | |
tree | 8fe7b546fe787061fca8f97ed2051f40f9b16a57 /kernel/trace/trace_syscalls.c | |
parent | fb34a08c3469b2be9eae626ccb96476b4687b810 (diff) |
tracing: Add individual syscalls tracepoint id support
The current state of syscalls tracepoints generates only one event id
for every syscall events.
This patch associates an id with each syscall trace event, so that we
can identify each syscall trace event using the 'perf' tool.
Signed-off-by: Jason Baron <jbaron@redhat.com>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: Jiaying Zhang <jiayingz@google.com>
Cc: Martin Bligh <mbligh@google.com>
Cc: Li Zefan <lizf@cn.fujitsu.com>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Diffstat (limited to 'kernel/trace/trace_syscalls.c')
-rw-r--r-- | kernel/trace/trace_syscalls.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index c7ae25ee95d8..e58a9c11ba85 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
@@ -36,14 +36,18 @@ print_syscall_enter(struct trace_iterator *iter, int flags) | |||
36 | struct syscall_metadata *entry; | 36 | struct syscall_metadata *entry; |
37 | int i, ret, syscall; | 37 | int i, ret, syscall; |
38 | 38 | ||
39 | trace_assign_type(trace, ent); | 39 | trace = (typeof(trace))ent; |
40 | |||
41 | syscall = trace->nr; | 40 | syscall = trace->nr; |
42 | |||
43 | entry = syscall_nr_to_meta(syscall); | 41 | entry = syscall_nr_to_meta(syscall); |
42 | |||
44 | if (!entry) | 43 | if (!entry) |
45 | goto end; | 44 | goto end; |
46 | 45 | ||
46 | if (entry->enter_id != ent->type) { | ||
47 | WARN_ON_ONCE(1); | ||
48 | goto end; | ||
49 | } | ||
50 | |||
47 | ret = trace_seq_printf(s, "%s(", entry->name); | 51 | ret = trace_seq_printf(s, "%s(", entry->name); |
48 | if (!ret) | 52 | if (!ret) |
49 | return TRACE_TYPE_PARTIAL_LINE; | 53 | return TRACE_TYPE_PARTIAL_LINE; |
@@ -78,16 +82,20 @@ print_syscall_exit(struct trace_iterator *iter, int flags) | |||
78 | struct syscall_metadata *entry; | 82 | struct syscall_metadata *entry; |
79 | int ret; | 83 | int ret; |
80 | 84 | ||
81 | trace_assign_type(trace, ent); | 85 | trace = (typeof(trace))ent; |
82 | |||
83 | syscall = trace->nr; | 86 | syscall = trace->nr; |
84 | |||
85 | entry = syscall_nr_to_meta(syscall); | 87 | entry = syscall_nr_to_meta(syscall); |
88 | |||
86 | if (!entry) { | 89 | if (!entry) { |
87 | trace_seq_printf(s, "\n"); | 90 | trace_seq_printf(s, "\n"); |
88 | return TRACE_TYPE_HANDLED; | 91 | return TRACE_TYPE_HANDLED; |
89 | } | 92 | } |
90 | 93 | ||
94 | if (entry->exit_id != ent->type) { | ||
95 | WARN_ON_ONCE(1); | ||
96 | return TRACE_TYPE_UNHANDLED; | ||
97 | } | ||
98 | |||
91 | ret = trace_seq_printf(s, "%s -> 0x%lx\n", entry->name, | 99 | ret = trace_seq_printf(s, "%s -> 0x%lx\n", entry->name, |
92 | trace->ret); | 100 | trace->ret); |
93 | if (!ret) | 101 | if (!ret) |
@@ -114,7 +122,7 @@ void ftrace_syscall_enter(struct pt_regs *regs, long id) | |||
114 | 122 | ||
115 | size = sizeof(*entry) + sizeof(unsigned long) * sys_data->nb_args; | 123 | size = sizeof(*entry) + sizeof(unsigned long) * sys_data->nb_args; |
116 | 124 | ||
117 | event = trace_current_buffer_lock_reserve(TRACE_SYSCALL_ENTER, size, | 125 | event = trace_current_buffer_lock_reserve(sys_data->enter_id, size, |
118 | 0, 0); | 126 | 0, 0); |
119 | if (!event) | 127 | if (!event) |
120 | return; | 128 | return; |
@@ -142,7 +150,7 @@ void ftrace_syscall_exit(struct pt_regs *regs, long ret) | |||
142 | if (!sys_data) | 150 | if (!sys_data) |
143 | return; | 151 | return; |
144 | 152 | ||
145 | event = trace_current_buffer_lock_reserve(TRACE_SYSCALL_EXIT, | 153 | event = trace_current_buffer_lock_reserve(sys_data->exit_id, |
146 | sizeof(*entry), 0, 0); | 154 | sizeof(*entry), 0, 0); |
147 | if (!event) | 155 | if (!event) |
148 | return; | 156 | return; |
@@ -239,10 +247,8 @@ void unreg_event_syscall_exit(void *ptr) | |||
239 | 247 | ||
240 | struct trace_event event_syscall_enter = { | 248 | struct trace_event event_syscall_enter = { |
241 | .trace = print_syscall_enter, | 249 | .trace = print_syscall_enter, |
242 | .type = TRACE_SYSCALL_ENTER | ||
243 | }; | 250 | }; |
244 | 251 | ||
245 | struct trace_event event_syscall_exit = { | 252 | struct trace_event event_syscall_exit = { |
246 | .trace = print_syscall_exit, | 253 | .trace = print_syscall_exit, |
247 | .type = TRACE_SYSCALL_EXIT | ||
248 | }; | 254 | }; |