diff options
author | Steven Rostedt <srostedt@redhat.com> | 2010-04-22 18:46:14 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-05-14 14:20:32 -0400 |
commit | a9a5776380208a3e48a92d0c763ee1a3b486fb73 (patch) | |
tree | 5ecd41c3b373e2156f5bf748ae777e022296a30c /include | |
parent | 0405ab80aa94afb13bf9ac4a6fc9f2923d4b9114 (diff) |
tracing: Allow events to share their print functions
Multiple events may use the same method to print their data.
Instead of having all events have a pointer to their print funtions,
the trace_event structure now points to a trace_event_functions structure
that will hold the way to print ouf the event.
The event itself is now passed to the print function to let the print
function know what kind of event it should print.
This opens the door to consolidating the way several events print
their output.
text data bss dec hex filename
4913961 1088356 861512 6863829 68bbd5 vmlinux.orig
4900382 1048964 861512 6810858 67ecea vmlinux.init
4900446 1049028 861512 6810986 67ed6a vmlinux.preprint
This change slightly increases the size but is needed for the next change.
v3: Fix the branch tracer events to handle this change.
v2: Fix the new function graph tracer event calls to handle this change.
Acked-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Acked-by: Masami Hiramatsu <mhiramat@redhat.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/ftrace_event.h | 17 | ||||
-rw-r--r-- | include/linux/syscalls.h | 10 | ||||
-rw-r--r-- | include/trace/ftrace.h | 13 | ||||
-rw-r--r-- | include/trace/syscall.h | 6 |
4 files changed, 32 insertions, 14 deletions
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 393a8394df0e..4f77932b0983 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
@@ -70,18 +70,25 @@ struct trace_iterator { | |||
70 | }; | 70 | }; |
71 | 71 | ||
72 | 72 | ||
73 | struct trace_event; | ||
74 | |||
73 | typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter, | 75 | typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter, |
74 | int flags); | 76 | int flags, struct trace_event *event); |
75 | struct trace_event { | 77 | |
76 | struct hlist_node node; | 78 | struct trace_event_functions { |
77 | struct list_head list; | ||
78 | int type; | ||
79 | trace_print_func trace; | 79 | trace_print_func trace; |
80 | trace_print_func raw; | 80 | trace_print_func raw; |
81 | trace_print_func hex; | 81 | trace_print_func hex; |
82 | trace_print_func binary; | 82 | trace_print_func binary; |
83 | }; | 83 | }; |
84 | 84 | ||
85 | struct trace_event { | ||
86 | struct hlist_node node; | ||
87 | struct list_head list; | ||
88 | int type; | ||
89 | struct trace_event_functions *funcs; | ||
90 | }; | ||
91 | |||
85 | extern int register_ftrace_event(struct trace_event *event); | 92 | extern int register_ftrace_event(struct trace_event *event); |
86 | extern int unregister_ftrace_event(struct trace_event *event); | 93 | extern int unregister_ftrace_event(struct trace_event *event); |
87 | 94 | ||
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 211c704a71ed..f7256770a20f 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -125,9 +125,12 @@ extern struct ftrace_event_class event_class_syscall_exit; | |||
125 | static struct syscall_metadata __syscall_meta_##sname; \ | 125 | static struct syscall_metadata __syscall_meta_##sname; \ |
126 | static struct ftrace_event_call \ | 126 | static struct ftrace_event_call \ |
127 | __attribute__((__aligned__(4))) event_enter_##sname; \ | 127 | __attribute__((__aligned__(4))) event_enter_##sname; \ |
128 | static struct trace_event enter_syscall_print_##sname = { \ | 128 | static struct trace_event_functions enter_syscall_print_funcs_##sname = { \ |
129 | .trace = print_syscall_enter, \ | 129 | .trace = print_syscall_enter, \ |
130 | }; \ | 130 | }; \ |
131 | static struct trace_event enter_syscall_print_##sname = { \ | ||
132 | .funcs = &enter_syscall_print_funcs_##sname, \ | ||
133 | }; \ | ||
131 | static struct ftrace_event_call __used \ | 134 | static struct ftrace_event_call __used \ |
132 | __attribute__((__aligned__(4))) \ | 135 | __attribute__((__aligned__(4))) \ |
133 | __attribute__((section("_ftrace_events"))) \ | 136 | __attribute__((section("_ftrace_events"))) \ |
@@ -142,9 +145,12 @@ extern struct ftrace_event_class event_class_syscall_exit; | |||
142 | static struct syscall_metadata __syscall_meta_##sname; \ | 145 | static struct syscall_metadata __syscall_meta_##sname; \ |
143 | static struct ftrace_event_call \ | 146 | static struct ftrace_event_call \ |
144 | __attribute__((__aligned__(4))) event_exit_##sname; \ | 147 | __attribute__((__aligned__(4))) event_exit_##sname; \ |
145 | static struct trace_event exit_syscall_print_##sname = { \ | 148 | static struct trace_event_functions exit_syscall_print_funcs_##sname = { \ |
146 | .trace = print_syscall_exit, \ | 149 | .trace = print_syscall_exit, \ |
147 | }; \ | 150 | }; \ |
151 | static struct trace_event exit_syscall_print_##sname = { \ | ||
152 | .funcs = &exit_syscall_print_funcs_##sname, \ | ||
153 | }; \ | ||
148 | static struct ftrace_event_call __used \ | 154 | static struct ftrace_event_call __used \ |
149 | __attribute__((__aligned__(4))) \ | 155 | __attribute__((__aligned__(4))) \ |
150 | __attribute__((section("_ftrace_events"))) \ | 156 | __attribute__((section("_ftrace_events"))) \ |
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index e7eb33420b06..51ed7f3568a5 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h | |||
@@ -239,7 +239,8 @@ ftrace_raw_output_id_##call(int event_id, const char *name, \ | |||
239 | #undef DEFINE_EVENT | 239 | #undef DEFINE_EVENT |
240 | #define DEFINE_EVENT(template, name, proto, args) \ | 240 | #define DEFINE_EVENT(template, name, proto, args) \ |
241 | static notrace enum print_line_t \ | 241 | static notrace enum print_line_t \ |
242 | ftrace_raw_output_##name(struct trace_iterator *iter, int flags) \ | 242 | ftrace_raw_output_##name(struct trace_iterator *iter, int flags, \ |
243 | struct trace_event *event) \ | ||
243 | { \ | 244 | { \ |
244 | return ftrace_raw_output_id_##template(event_##name.id, \ | 245 | return ftrace_raw_output_id_##template(event_##name.id, \ |
245 | #name, iter, flags); \ | 246 | #name, iter, flags); \ |
@@ -248,7 +249,8 @@ ftrace_raw_output_##name(struct trace_iterator *iter, int flags) \ | |||
248 | #undef DEFINE_EVENT_PRINT | 249 | #undef DEFINE_EVENT_PRINT |
249 | #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ | 250 | #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ |
250 | static notrace enum print_line_t \ | 251 | static notrace enum print_line_t \ |
251 | ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ | 252 | ftrace_raw_output_##call(struct trace_iterator *iter, int flags, \ |
253 | struct trace_event *event) \ | ||
252 | { \ | 254 | { \ |
253 | struct trace_seq *s = &iter->seq; \ | 255 | struct trace_seq *s = &iter->seq; \ |
254 | struct ftrace_raw_##template *field; \ | 256 | struct ftrace_raw_##template *field; \ |
@@ -531,11 +533,12 @@ ftrace_raw_event_##call(void *__data, proto) \ | |||
531 | 533 | ||
532 | #undef DEFINE_EVENT | 534 | #undef DEFINE_EVENT |
533 | #define DEFINE_EVENT(template, call, proto, args) \ | 535 | #define DEFINE_EVENT(template, call, proto, args) \ |
534 | \ | 536 | static struct trace_event_functions ftrace_event_type_funcs_##call = { \ |
535 | static struct trace_event ftrace_event_type_##call = { \ | ||
536 | .trace = ftrace_raw_output_##call, \ | 537 | .trace = ftrace_raw_output_##call, \ |
537 | }; \ | 538 | }; \ |
538 | \ | 539 | static struct trace_event ftrace_event_type_##call = { \ |
540 | .funcs = &ftrace_event_type_funcs_##call, \ | ||
541 | }; \ | ||
539 | static inline void ftrace_test_probe_##call(void) \ | 542 | static inline void ftrace_test_probe_##call(void) \ |
540 | { \ | 543 | { \ |
541 | check_trace_callback_type_##call(ftrace_raw_event_##template); \ | 544 | check_trace_callback_type_##call(ftrace_raw_event_##template); \ |
diff --git a/include/trace/syscall.h b/include/trace/syscall.h index 39647743cd95..257e08960d7b 100644 --- a/include/trace/syscall.h +++ b/include/trace/syscall.h | |||
@@ -42,8 +42,10 @@ extern int reg_event_syscall_exit(struct ftrace_event_call *call); | |||
42 | extern void unreg_event_syscall_exit(struct ftrace_event_call *call); | 42 | extern void unreg_event_syscall_exit(struct ftrace_event_call *call); |
43 | extern int | 43 | extern int |
44 | ftrace_format_syscall(struct ftrace_event_call *call, struct trace_seq *s); | 44 | ftrace_format_syscall(struct ftrace_event_call *call, struct trace_seq *s); |
45 | enum print_line_t print_syscall_enter(struct trace_iterator *iter, int flags); | 45 | enum print_line_t print_syscall_enter(struct trace_iterator *iter, int flags, |
46 | enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags); | 46 | struct trace_event *event); |
47 | enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags, | ||
48 | struct trace_event *event); | ||
47 | #endif | 49 | #endif |
48 | 50 | ||
49 | #ifdef CONFIG_PERF_EVENTS | 51 | #ifdef CONFIG_PERF_EVENTS |