diff options
-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 | ||||
-rw-r--r-- | kernel/trace/blktrace.c | 13 | ||||
-rw-r--r-- | kernel/trace/kmemtrace.c | 28 | ||||
-rw-r--r-- | kernel/trace/trace.c | 9 | ||||
-rw-r--r-- | kernel/trace/trace_branch.c | 8 | ||||
-rw-r--r-- | kernel/trace/trace_functions_graph.c | 13 | ||||
-rw-r--r-- | kernel/trace/trace_kprobe.c | 22 | ||||
-rw-r--r-- | kernel/trace/trace_output.c | 137 | ||||
-rw-r--r-- | kernel/trace/trace_output.h | 2 | ||||
-rw-r--r-- | kernel/trace/trace_syscalls.c | 6 |
13 files changed, 192 insertions, 92 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 |
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 19d93f83e3c3..36ea2b65dcdc 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
@@ -1336,7 +1336,7 @@ out: | |||
1336 | } | 1336 | } |
1337 | 1337 | ||
1338 | static enum print_line_t blk_trace_event_print(struct trace_iterator *iter, | 1338 | static enum print_line_t blk_trace_event_print(struct trace_iterator *iter, |
1339 | int flags) | 1339 | int flags, struct trace_event *event) |
1340 | { | 1340 | { |
1341 | return print_one_line(iter, false); | 1341 | return print_one_line(iter, false); |
1342 | } | 1342 | } |
@@ -1358,7 +1358,8 @@ static int blk_trace_synthesize_old_trace(struct trace_iterator *iter) | |||
1358 | } | 1358 | } |
1359 | 1359 | ||
1360 | static enum print_line_t | 1360 | static enum print_line_t |
1361 | blk_trace_event_print_binary(struct trace_iterator *iter, int flags) | 1361 | blk_trace_event_print_binary(struct trace_iterator *iter, int flags, |
1362 | struct trace_event *event) | ||
1362 | { | 1363 | { |
1363 | return blk_trace_synthesize_old_trace(iter) ? | 1364 | return blk_trace_synthesize_old_trace(iter) ? |
1364 | TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE; | 1365 | TRACE_TYPE_HANDLED : TRACE_TYPE_PARTIAL_LINE; |
@@ -1396,12 +1397,16 @@ static struct tracer blk_tracer __read_mostly = { | |||
1396 | .set_flag = blk_tracer_set_flag, | 1397 | .set_flag = blk_tracer_set_flag, |
1397 | }; | 1398 | }; |
1398 | 1399 | ||
1399 | static struct trace_event trace_blk_event = { | 1400 | static struct trace_event_functions trace_blk_event_funcs = { |
1400 | .type = TRACE_BLK, | ||
1401 | .trace = blk_trace_event_print, | 1401 | .trace = blk_trace_event_print, |
1402 | .binary = blk_trace_event_print_binary, | 1402 | .binary = blk_trace_event_print_binary, |
1403 | }; | 1403 | }; |
1404 | 1404 | ||
1405 | static struct trace_event trace_blk_event = { | ||
1406 | .type = TRACE_BLK, | ||
1407 | .funcs = &trace_blk_event_funcs, | ||
1408 | }; | ||
1409 | |||
1405 | static int __init init_blk_tracer(void) | 1410 | static int __init init_blk_tracer(void) |
1406 | { | 1411 | { |
1407 | if (!register_ftrace_event(&trace_blk_event)) { | 1412 | if (!register_ftrace_event(&trace_blk_event)) { |
diff --git a/kernel/trace/kmemtrace.c b/kernel/trace/kmemtrace.c index 7253d0c1c32f..bbfc1bb1660b 100644 --- a/kernel/trace/kmemtrace.c +++ b/kernel/trace/kmemtrace.c | |||
@@ -243,7 +243,8 @@ struct kmemtrace_user_event_alloc { | |||
243 | }; | 243 | }; |
244 | 244 | ||
245 | static enum print_line_t | 245 | static enum print_line_t |
246 | kmemtrace_print_alloc(struct trace_iterator *iter, int flags) | 246 | kmemtrace_print_alloc(struct trace_iterator *iter, int flags, |
247 | struct trace_event *event) | ||
247 | { | 248 | { |
248 | struct trace_seq *s = &iter->seq; | 249 | struct trace_seq *s = &iter->seq; |
249 | struct kmemtrace_alloc_entry *entry; | 250 | struct kmemtrace_alloc_entry *entry; |
@@ -263,7 +264,8 @@ kmemtrace_print_alloc(struct trace_iterator *iter, int flags) | |||
263 | } | 264 | } |
264 | 265 | ||
265 | static enum print_line_t | 266 | static enum print_line_t |
266 | kmemtrace_print_free(struct trace_iterator *iter, int flags) | 267 | kmemtrace_print_free(struct trace_iterator *iter, int flags, |
268 | struct trace_event *event) | ||
267 | { | 269 | { |
268 | struct trace_seq *s = &iter->seq; | 270 | struct trace_seq *s = &iter->seq; |
269 | struct kmemtrace_free_entry *entry; | 271 | struct kmemtrace_free_entry *entry; |
@@ -281,7 +283,8 @@ kmemtrace_print_free(struct trace_iterator *iter, int flags) | |||
281 | } | 283 | } |
282 | 284 | ||
283 | static enum print_line_t | 285 | static enum print_line_t |
284 | kmemtrace_print_alloc_user(struct trace_iterator *iter, int flags) | 286 | kmemtrace_print_alloc_user(struct trace_iterator *iter, int flags, |
287 | struct trace_event *event) | ||
285 | { | 288 | { |
286 | struct trace_seq *s = &iter->seq; | 289 | struct trace_seq *s = &iter->seq; |
287 | struct kmemtrace_alloc_entry *entry; | 290 | struct kmemtrace_alloc_entry *entry; |
@@ -315,7 +318,8 @@ kmemtrace_print_alloc_user(struct trace_iterator *iter, int flags) | |||
315 | } | 318 | } |
316 | 319 | ||
317 | static enum print_line_t | 320 | static enum print_line_t |
318 | kmemtrace_print_free_user(struct trace_iterator *iter, int flags) | 321 | kmemtrace_print_free_user(struct trace_iterator *iter, int flags, |
322 | struct trace_event *event) | ||
319 | { | 323 | { |
320 | struct trace_seq *s = &iter->seq; | 324 | struct trace_seq *s = &iter->seq; |
321 | struct kmemtrace_free_entry *entry; | 325 | struct kmemtrace_free_entry *entry; |
@@ -469,18 +473,26 @@ static enum print_line_t kmemtrace_print_line(struct trace_iterator *iter) | |||
469 | } | 473 | } |
470 | } | 474 | } |
471 | 475 | ||
472 | static struct trace_event kmem_trace_alloc = { | 476 | static struct trace_event_functions kmem_trace_alloc_funcs = { |
473 | .type = TRACE_KMEM_ALLOC, | ||
474 | .trace = kmemtrace_print_alloc, | 477 | .trace = kmemtrace_print_alloc, |
475 | .binary = kmemtrace_print_alloc_user, | 478 | .binary = kmemtrace_print_alloc_user, |
476 | }; | 479 | }; |
477 | 480 | ||
478 | static struct trace_event kmem_trace_free = { | 481 | static struct trace_event kmem_trace_alloc = { |
479 | .type = TRACE_KMEM_FREE, | 482 | .type = TRACE_KMEM_ALLOC, |
483 | .funcs = &kmem_trace_alloc_funcs, | ||
484 | }; | ||
485 | |||
486 | static struct trace_event_functions kmem_trace_free_funcs = { | ||
480 | .trace = kmemtrace_print_free, | 487 | .trace = kmemtrace_print_free, |
481 | .binary = kmemtrace_print_free_user, | 488 | .binary = kmemtrace_print_free_user, |
482 | }; | 489 | }; |
483 | 490 | ||
491 | static struct trace_event kmem_trace_free = { | ||
492 | .type = TRACE_KMEM_FREE, | ||
493 | .funcs = &kmem_trace_free_funcs, | ||
494 | }; | ||
495 | |||
484 | static struct tracer kmem_tracer __read_mostly = { | 496 | static struct tracer kmem_tracer __read_mostly = { |
485 | .name = "kmemtrace", | 497 | .name = "kmemtrace", |
486 | .init = kmem_trace_init, | 498 | .init = kmem_trace_init, |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 756d7283318b..ba0ec81158b2 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -1936,7 +1936,7 @@ static enum print_line_t print_trace_fmt(struct trace_iterator *iter) | |||
1936 | } | 1936 | } |
1937 | 1937 | ||
1938 | if (event) | 1938 | if (event) |
1939 | return event->trace(iter, sym_flags); | 1939 | return event->funcs->trace(iter, sym_flags, event); |
1940 | 1940 | ||
1941 | if (!trace_seq_printf(s, "Unknown type %d\n", entry->type)) | 1941 | if (!trace_seq_printf(s, "Unknown type %d\n", entry->type)) |
1942 | goto partial; | 1942 | goto partial; |
@@ -1962,7 +1962,7 @@ static enum print_line_t print_raw_fmt(struct trace_iterator *iter) | |||
1962 | 1962 | ||
1963 | event = ftrace_find_event(entry->type); | 1963 | event = ftrace_find_event(entry->type); |
1964 | if (event) | 1964 | if (event) |
1965 | return event->raw(iter, 0); | 1965 | return event->funcs->raw(iter, 0, event); |
1966 | 1966 | ||
1967 | if (!trace_seq_printf(s, "%d ?\n", entry->type)) | 1967 | if (!trace_seq_printf(s, "%d ?\n", entry->type)) |
1968 | goto partial; | 1968 | goto partial; |
@@ -1989,7 +1989,7 @@ static enum print_line_t print_hex_fmt(struct trace_iterator *iter) | |||
1989 | 1989 | ||
1990 | event = ftrace_find_event(entry->type); | 1990 | event = ftrace_find_event(entry->type); |
1991 | if (event) { | 1991 | if (event) { |
1992 | enum print_line_t ret = event->hex(iter, 0); | 1992 | enum print_line_t ret = event->funcs->hex(iter, 0, event); |
1993 | if (ret != TRACE_TYPE_HANDLED) | 1993 | if (ret != TRACE_TYPE_HANDLED) |
1994 | return ret; | 1994 | return ret; |
1995 | } | 1995 | } |
@@ -2014,7 +2014,8 @@ static enum print_line_t print_bin_fmt(struct trace_iterator *iter) | |||
2014 | } | 2014 | } |
2015 | 2015 | ||
2016 | event = ftrace_find_event(entry->type); | 2016 | event = ftrace_find_event(entry->type); |
2017 | return event ? event->binary(iter, 0) : TRACE_TYPE_HANDLED; | 2017 | return event ? event->funcs->binary(iter, 0, event) : |
2018 | TRACE_TYPE_HANDLED; | ||
2018 | } | 2019 | } |
2019 | 2020 | ||
2020 | int trace_empty(struct trace_iterator *iter) | 2021 | int trace_empty(struct trace_iterator *iter) |
diff --git a/kernel/trace/trace_branch.c b/kernel/trace/trace_branch.c index b9bc4d470177..8d3538b4ea5f 100644 --- a/kernel/trace/trace_branch.c +++ b/kernel/trace/trace_branch.c | |||
@@ -143,7 +143,7 @@ static void branch_trace_reset(struct trace_array *tr) | |||
143 | } | 143 | } |
144 | 144 | ||
145 | static enum print_line_t trace_branch_print(struct trace_iterator *iter, | 145 | static enum print_line_t trace_branch_print(struct trace_iterator *iter, |
146 | int flags) | 146 | int flags, struct trace_event *event) |
147 | { | 147 | { |
148 | struct trace_branch *field; | 148 | struct trace_branch *field; |
149 | 149 | ||
@@ -167,9 +167,13 @@ static void branch_print_header(struct seq_file *s) | |||
167 | " |\n"); | 167 | " |\n"); |
168 | } | 168 | } |
169 | 169 | ||
170 | static struct trace_event_functions trace_branch_funcs = { | ||
171 | .trace = trace_branch_print, | ||
172 | }; | ||
173 | |||
170 | static struct trace_event trace_branch_event = { | 174 | static struct trace_event trace_branch_event = { |
171 | .type = TRACE_BRANCH, | 175 | .type = TRACE_BRANCH, |
172 | .trace = trace_branch_print, | 176 | .funcs = &trace_branch_funcs, |
173 | }; | 177 | }; |
174 | 178 | ||
175 | static struct tracer branch_trace __read_mostly = | 179 | static struct tracer branch_trace __read_mostly = |
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index dd11c830eb84..79f4bac99a94 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c | |||
@@ -1025,7 +1025,7 @@ print_graph_comment(struct trace_seq *s, struct trace_entry *ent, | |||
1025 | if (!event) | 1025 | if (!event) |
1026 | return TRACE_TYPE_UNHANDLED; | 1026 | return TRACE_TYPE_UNHANDLED; |
1027 | 1027 | ||
1028 | ret = event->trace(iter, sym_flags); | 1028 | ret = event->funcs->trace(iter, sym_flags, event); |
1029 | if (ret != TRACE_TYPE_HANDLED) | 1029 | if (ret != TRACE_TYPE_HANDLED) |
1030 | return ret; | 1030 | return ret; |
1031 | } | 1031 | } |
@@ -1112,7 +1112,8 @@ print_graph_function(struct trace_iterator *iter) | |||
1112 | } | 1112 | } |
1113 | 1113 | ||
1114 | static enum print_line_t | 1114 | static enum print_line_t |
1115 | print_graph_function_event(struct trace_iterator *iter, int flags) | 1115 | print_graph_function_event(struct trace_iterator *iter, int flags, |
1116 | struct trace_event *event) | ||
1116 | { | 1117 | { |
1117 | return print_graph_function(iter); | 1118 | return print_graph_function(iter); |
1118 | } | 1119 | } |
@@ -1225,14 +1226,18 @@ void graph_trace_close(struct trace_iterator *iter) | |||
1225 | } | 1226 | } |
1226 | } | 1227 | } |
1227 | 1228 | ||
1229 | static struct trace_event_functions graph_functions = { | ||
1230 | .trace = print_graph_function_event, | ||
1231 | }; | ||
1232 | |||
1228 | static struct trace_event graph_trace_entry_event = { | 1233 | static struct trace_event graph_trace_entry_event = { |
1229 | .type = TRACE_GRAPH_ENT, | 1234 | .type = TRACE_GRAPH_ENT, |
1230 | .trace = print_graph_function_event, | 1235 | .funcs = &graph_functions, |
1231 | }; | 1236 | }; |
1232 | 1237 | ||
1233 | static struct trace_event graph_trace_ret_event = { | 1238 | static struct trace_event graph_trace_ret_event = { |
1234 | .type = TRACE_GRAPH_RET, | 1239 | .type = TRACE_GRAPH_RET, |
1235 | .trace = print_graph_function_event, | 1240 | .funcs = &graph_functions |
1236 | }; | 1241 | }; |
1237 | 1242 | ||
1238 | static struct tracer graph_trace __read_mostly = { | 1243 | static struct tracer graph_trace __read_mostly = { |
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 428f4a52de69..b989ae229a20 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c | |||
@@ -1011,16 +1011,15 @@ static __kprobes void kretprobe_trace_func(struct kretprobe_instance *ri, | |||
1011 | 1011 | ||
1012 | /* Event entry printers */ | 1012 | /* Event entry printers */ |
1013 | enum print_line_t | 1013 | enum print_line_t |
1014 | print_kprobe_event(struct trace_iterator *iter, int flags) | 1014 | print_kprobe_event(struct trace_iterator *iter, int flags, |
1015 | struct trace_event *event) | ||
1015 | { | 1016 | { |
1016 | struct kprobe_trace_entry *field; | 1017 | struct kprobe_trace_entry *field; |
1017 | struct trace_seq *s = &iter->seq; | 1018 | struct trace_seq *s = &iter->seq; |
1018 | struct trace_event *event; | ||
1019 | struct trace_probe *tp; | 1019 | struct trace_probe *tp; |
1020 | int i; | 1020 | int i; |
1021 | 1021 | ||
1022 | field = (struct kprobe_trace_entry *)iter->ent; | 1022 | field = (struct kprobe_trace_entry *)iter->ent; |
1023 | event = ftrace_find_event(field->ent.type); | ||
1024 | tp = container_of(event, struct trace_probe, event); | 1023 | tp = container_of(event, struct trace_probe, event); |
1025 | 1024 | ||
1026 | if (!trace_seq_printf(s, "%s: (", tp->call.name)) | 1025 | if (!trace_seq_printf(s, "%s: (", tp->call.name)) |
@@ -1046,16 +1045,15 @@ partial: | |||
1046 | } | 1045 | } |
1047 | 1046 | ||
1048 | enum print_line_t | 1047 | enum print_line_t |
1049 | print_kretprobe_event(struct trace_iterator *iter, int flags) | 1048 | print_kretprobe_event(struct trace_iterator *iter, int flags, |
1049 | struct trace_event *event) | ||
1050 | { | 1050 | { |
1051 | struct kretprobe_trace_entry *field; | 1051 | struct kretprobe_trace_entry *field; |
1052 | struct trace_seq *s = &iter->seq; | 1052 | struct trace_seq *s = &iter->seq; |
1053 | struct trace_event *event; | ||
1054 | struct trace_probe *tp; | 1053 | struct trace_probe *tp; |
1055 | int i; | 1054 | int i; |
1056 | 1055 | ||
1057 | field = (struct kretprobe_trace_entry *)iter->ent; | 1056 | field = (struct kretprobe_trace_entry *)iter->ent; |
1058 | event = ftrace_find_event(field->ent.type); | ||
1059 | tp = container_of(event, struct trace_probe, event); | 1057 | tp = container_of(event, struct trace_probe, event); |
1060 | 1058 | ||
1061 | if (!trace_seq_printf(s, "%s: (", tp->call.name)) | 1059 | if (!trace_seq_printf(s, "%s: (", tp->call.name)) |
@@ -1351,6 +1349,14 @@ int kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs) | |||
1351 | return 0; /* We don't tweek kernel, so just return 0 */ | 1349 | return 0; /* We don't tweek kernel, so just return 0 */ |
1352 | } | 1350 | } |
1353 | 1351 | ||
1352 | static struct trace_event_functions kretprobe_funcs = { | ||
1353 | .trace = print_kretprobe_event | ||
1354 | }; | ||
1355 | |||
1356 | static struct trace_event_functions kprobe_funcs = { | ||
1357 | .trace = print_kprobe_event | ||
1358 | }; | ||
1359 | |||
1354 | static int register_probe_event(struct trace_probe *tp) | 1360 | static int register_probe_event(struct trace_probe *tp) |
1355 | { | 1361 | { |
1356 | struct ftrace_event_call *call = &tp->call; | 1362 | struct ftrace_event_call *call = &tp->call; |
@@ -1358,13 +1364,13 @@ static int register_probe_event(struct trace_probe *tp) | |||
1358 | 1364 | ||
1359 | /* Initialize ftrace_event_call */ | 1365 | /* Initialize ftrace_event_call */ |
1360 | if (probe_is_return(tp)) { | 1366 | if (probe_is_return(tp)) { |
1361 | tp->event.trace = print_kretprobe_event; | 1367 | tp->event.funcs = &kretprobe_funcs; |
1362 | INIT_LIST_HEAD(&call->class->fields); | 1368 | INIT_LIST_HEAD(&call->class->fields); |
1363 | call->class->raw_init = probe_event_raw_init; | 1369 | call->class->raw_init = probe_event_raw_init; |
1364 | call->class->define_fields = kretprobe_event_define_fields; | 1370 | call->class->define_fields = kretprobe_event_define_fields; |
1365 | } else { | 1371 | } else { |
1366 | INIT_LIST_HEAD(&call->class->fields); | 1372 | INIT_LIST_HEAD(&call->class->fields); |
1367 | tp->event.trace = print_kprobe_event; | 1373 | tp->event.funcs = &kprobe_funcs; |
1368 | call->class->raw_init = probe_event_raw_init; | 1374 | call->class->raw_init = probe_event_raw_init; |
1369 | call->class->define_fields = kprobe_event_define_fields; | 1375 | call->class->define_fields = kprobe_event_define_fields; |
1370 | } | 1376 | } |
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 2404c129a8c9..fc9d4dbb089e 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
@@ -726,6 +726,9 @@ int register_ftrace_event(struct trace_event *event) | |||
726 | if (WARN_ON(!event)) | 726 | if (WARN_ON(!event)) |
727 | goto out; | 727 | goto out; |
728 | 728 | ||
729 | if (WARN_ON(!event->funcs)) | ||
730 | goto out; | ||
731 | |||
729 | INIT_LIST_HEAD(&event->list); | 732 | INIT_LIST_HEAD(&event->list); |
730 | 733 | ||
731 | if (!event->type) { | 734 | if (!event->type) { |
@@ -758,14 +761,14 @@ int register_ftrace_event(struct trace_event *event) | |||
758 | goto out; | 761 | goto out; |
759 | } | 762 | } |
760 | 763 | ||
761 | if (event->trace == NULL) | 764 | if (event->funcs->trace == NULL) |
762 | event->trace = trace_nop_print; | 765 | event->funcs->trace = trace_nop_print; |
763 | if (event->raw == NULL) | 766 | if (event->funcs->raw == NULL) |
764 | event->raw = trace_nop_print; | 767 | event->funcs->raw = trace_nop_print; |
765 | if (event->hex == NULL) | 768 | if (event->funcs->hex == NULL) |
766 | event->hex = trace_nop_print; | 769 | event->funcs->hex = trace_nop_print; |
767 | if (event->binary == NULL) | 770 | if (event->funcs->binary == NULL) |
768 | event->binary = trace_nop_print; | 771 | event->funcs->binary = trace_nop_print; |
769 | 772 | ||
770 | key = event->type & (EVENT_HASHSIZE - 1); | 773 | key = event->type & (EVENT_HASHSIZE - 1); |
771 | 774 | ||
@@ -807,13 +810,15 @@ EXPORT_SYMBOL_GPL(unregister_ftrace_event); | |||
807 | * Standard events | 810 | * Standard events |
808 | */ | 811 | */ |
809 | 812 | ||
810 | enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags) | 813 | enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags, |
814 | struct trace_event *event) | ||
811 | { | 815 | { |
812 | return TRACE_TYPE_HANDLED; | 816 | return TRACE_TYPE_HANDLED; |
813 | } | 817 | } |
814 | 818 | ||
815 | /* TRACE_FN */ | 819 | /* TRACE_FN */ |
816 | static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags) | 820 | static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags, |
821 | struct trace_event *event) | ||
817 | { | 822 | { |
818 | struct ftrace_entry *field; | 823 | struct ftrace_entry *field; |
819 | struct trace_seq *s = &iter->seq; | 824 | struct trace_seq *s = &iter->seq; |
@@ -840,7 +845,8 @@ static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags) | |||
840 | return TRACE_TYPE_PARTIAL_LINE; | 845 | return TRACE_TYPE_PARTIAL_LINE; |
841 | } | 846 | } |
842 | 847 | ||
843 | static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags) | 848 | static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags, |
849 | struct trace_event *event) | ||
844 | { | 850 | { |
845 | struct ftrace_entry *field; | 851 | struct ftrace_entry *field; |
846 | 852 | ||
@@ -854,7 +860,8 @@ static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags) | |||
854 | return TRACE_TYPE_HANDLED; | 860 | return TRACE_TYPE_HANDLED; |
855 | } | 861 | } |
856 | 862 | ||
857 | static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags) | 863 | static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags, |
864 | struct trace_event *event) | ||
858 | { | 865 | { |
859 | struct ftrace_entry *field; | 866 | struct ftrace_entry *field; |
860 | struct trace_seq *s = &iter->seq; | 867 | struct trace_seq *s = &iter->seq; |
@@ -867,7 +874,8 @@ static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags) | |||
867 | return TRACE_TYPE_HANDLED; | 874 | return TRACE_TYPE_HANDLED; |
868 | } | 875 | } |
869 | 876 | ||
870 | static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags) | 877 | static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags, |
878 | struct trace_event *event) | ||
871 | { | 879 | { |
872 | struct ftrace_entry *field; | 880 | struct ftrace_entry *field; |
873 | struct trace_seq *s = &iter->seq; | 881 | struct trace_seq *s = &iter->seq; |
@@ -880,14 +888,18 @@ static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags) | |||
880 | return TRACE_TYPE_HANDLED; | 888 | return TRACE_TYPE_HANDLED; |
881 | } | 889 | } |
882 | 890 | ||
883 | static struct trace_event trace_fn_event = { | 891 | static struct trace_event_functions trace_fn_funcs = { |
884 | .type = TRACE_FN, | ||
885 | .trace = trace_fn_trace, | 892 | .trace = trace_fn_trace, |
886 | .raw = trace_fn_raw, | 893 | .raw = trace_fn_raw, |
887 | .hex = trace_fn_hex, | 894 | .hex = trace_fn_hex, |
888 | .binary = trace_fn_bin, | 895 | .binary = trace_fn_bin, |
889 | }; | 896 | }; |
890 | 897 | ||
898 | static struct trace_event trace_fn_event = { | ||
899 | .type = TRACE_FN, | ||
900 | .funcs = &trace_fn_funcs, | ||
901 | }; | ||
902 | |||
891 | /* TRACE_CTX an TRACE_WAKE */ | 903 | /* TRACE_CTX an TRACE_WAKE */ |
892 | static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter, | 904 | static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter, |
893 | char *delim) | 905 | char *delim) |
@@ -916,13 +928,14 @@ static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter, | |||
916 | return TRACE_TYPE_HANDLED; | 928 | return TRACE_TYPE_HANDLED; |
917 | } | 929 | } |
918 | 930 | ||
919 | static enum print_line_t trace_ctx_print(struct trace_iterator *iter, int flags) | 931 | static enum print_line_t trace_ctx_print(struct trace_iterator *iter, int flags, |
932 | struct trace_event *event) | ||
920 | { | 933 | { |
921 | return trace_ctxwake_print(iter, "==>"); | 934 | return trace_ctxwake_print(iter, "==>"); |
922 | } | 935 | } |
923 | 936 | ||
924 | static enum print_line_t trace_wake_print(struct trace_iterator *iter, | 937 | static enum print_line_t trace_wake_print(struct trace_iterator *iter, |
925 | int flags) | 938 | int flags, struct trace_event *event) |
926 | { | 939 | { |
927 | return trace_ctxwake_print(iter, " +"); | 940 | return trace_ctxwake_print(iter, " +"); |
928 | } | 941 | } |
@@ -950,12 +963,14 @@ static int trace_ctxwake_raw(struct trace_iterator *iter, char S) | |||
950 | return TRACE_TYPE_HANDLED; | 963 | return TRACE_TYPE_HANDLED; |
951 | } | 964 | } |
952 | 965 | ||
953 | static enum print_line_t trace_ctx_raw(struct trace_iterator *iter, int flags) | 966 | static enum print_line_t trace_ctx_raw(struct trace_iterator *iter, int flags, |
967 | struct trace_event *event) | ||
954 | { | 968 | { |
955 | return trace_ctxwake_raw(iter, 0); | 969 | return trace_ctxwake_raw(iter, 0); |
956 | } | 970 | } |
957 | 971 | ||
958 | static enum print_line_t trace_wake_raw(struct trace_iterator *iter, int flags) | 972 | static enum print_line_t trace_wake_raw(struct trace_iterator *iter, int flags, |
973 | struct trace_event *event) | ||
959 | { | 974 | { |
960 | return trace_ctxwake_raw(iter, '+'); | 975 | return trace_ctxwake_raw(iter, '+'); |
961 | } | 976 | } |
@@ -984,18 +999,20 @@ static int trace_ctxwake_hex(struct trace_iterator *iter, char S) | |||
984 | return TRACE_TYPE_HANDLED; | 999 | return TRACE_TYPE_HANDLED; |
985 | } | 1000 | } |
986 | 1001 | ||
987 | static enum print_line_t trace_ctx_hex(struct trace_iterator *iter, int flags) | 1002 | static enum print_line_t trace_ctx_hex(struct trace_iterator *iter, int flags, |
1003 | struct trace_event *event) | ||
988 | { | 1004 | { |
989 | return trace_ctxwake_hex(iter, 0); | 1005 | return trace_ctxwake_hex(iter, 0); |
990 | } | 1006 | } |
991 | 1007 | ||
992 | static enum print_line_t trace_wake_hex(struct trace_iterator *iter, int flags) | 1008 | static enum print_line_t trace_wake_hex(struct trace_iterator *iter, int flags, |
1009 | struct trace_event *event) | ||
993 | { | 1010 | { |
994 | return trace_ctxwake_hex(iter, '+'); | 1011 | return trace_ctxwake_hex(iter, '+'); |
995 | } | 1012 | } |
996 | 1013 | ||
997 | static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter, | 1014 | static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter, |
998 | int flags) | 1015 | int flags, struct trace_event *event) |
999 | { | 1016 | { |
1000 | struct ctx_switch_entry *field; | 1017 | struct ctx_switch_entry *field; |
1001 | struct trace_seq *s = &iter->seq; | 1018 | struct trace_seq *s = &iter->seq; |
@@ -1012,25 +1029,33 @@ static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter, | |||
1012 | return TRACE_TYPE_HANDLED; | 1029 | return TRACE_TYPE_HANDLED; |
1013 | } | 1030 | } |
1014 | 1031 | ||
1015 | static struct trace_event trace_ctx_event = { | 1032 | static struct trace_event_functions trace_ctx_funcs = { |
1016 | .type = TRACE_CTX, | ||
1017 | .trace = trace_ctx_print, | 1033 | .trace = trace_ctx_print, |
1018 | .raw = trace_ctx_raw, | 1034 | .raw = trace_ctx_raw, |
1019 | .hex = trace_ctx_hex, | 1035 | .hex = trace_ctx_hex, |
1020 | .binary = trace_ctxwake_bin, | 1036 | .binary = trace_ctxwake_bin, |
1021 | }; | 1037 | }; |
1022 | 1038 | ||
1023 | static struct trace_event trace_wake_event = { | 1039 | static struct trace_event trace_ctx_event = { |
1024 | .type = TRACE_WAKE, | 1040 | .type = TRACE_CTX, |
1041 | .funcs = &trace_ctx_funcs, | ||
1042 | }; | ||
1043 | |||
1044 | static struct trace_event_functions trace_wake_funcs = { | ||
1025 | .trace = trace_wake_print, | 1045 | .trace = trace_wake_print, |
1026 | .raw = trace_wake_raw, | 1046 | .raw = trace_wake_raw, |
1027 | .hex = trace_wake_hex, | 1047 | .hex = trace_wake_hex, |
1028 | .binary = trace_ctxwake_bin, | 1048 | .binary = trace_ctxwake_bin, |
1029 | }; | 1049 | }; |
1030 | 1050 | ||
1051 | static struct trace_event trace_wake_event = { | ||
1052 | .type = TRACE_WAKE, | ||
1053 | .funcs = &trace_wake_funcs, | ||
1054 | }; | ||
1055 | |||
1031 | /* TRACE_SPECIAL */ | 1056 | /* TRACE_SPECIAL */ |
1032 | static enum print_line_t trace_special_print(struct trace_iterator *iter, | 1057 | static enum print_line_t trace_special_print(struct trace_iterator *iter, |
1033 | int flags) | 1058 | int flags, struct trace_event *event) |
1034 | { | 1059 | { |
1035 | struct special_entry *field; | 1060 | struct special_entry *field; |
1036 | 1061 | ||
@@ -1046,7 +1071,7 @@ static enum print_line_t trace_special_print(struct trace_iterator *iter, | |||
1046 | } | 1071 | } |
1047 | 1072 | ||
1048 | static enum print_line_t trace_special_hex(struct trace_iterator *iter, | 1073 | static enum print_line_t trace_special_hex(struct trace_iterator *iter, |
1049 | int flags) | 1074 | int flags, struct trace_event *event) |
1050 | { | 1075 | { |
1051 | struct special_entry *field; | 1076 | struct special_entry *field; |
1052 | struct trace_seq *s = &iter->seq; | 1077 | struct trace_seq *s = &iter->seq; |
@@ -1061,7 +1086,7 @@ static enum print_line_t trace_special_hex(struct trace_iterator *iter, | |||
1061 | } | 1086 | } |
1062 | 1087 | ||
1063 | static enum print_line_t trace_special_bin(struct trace_iterator *iter, | 1088 | static enum print_line_t trace_special_bin(struct trace_iterator *iter, |
1064 | int flags) | 1089 | int flags, struct trace_event *event) |
1065 | { | 1090 | { |
1066 | struct special_entry *field; | 1091 | struct special_entry *field; |
1067 | struct trace_seq *s = &iter->seq; | 1092 | struct trace_seq *s = &iter->seq; |
@@ -1075,18 +1100,22 @@ static enum print_line_t trace_special_bin(struct trace_iterator *iter, | |||
1075 | return TRACE_TYPE_HANDLED; | 1100 | return TRACE_TYPE_HANDLED; |
1076 | } | 1101 | } |
1077 | 1102 | ||
1078 | static struct trace_event trace_special_event = { | 1103 | static struct trace_event_functions trace_special_funcs = { |
1079 | .type = TRACE_SPECIAL, | ||
1080 | .trace = trace_special_print, | 1104 | .trace = trace_special_print, |
1081 | .raw = trace_special_print, | 1105 | .raw = trace_special_print, |
1082 | .hex = trace_special_hex, | 1106 | .hex = trace_special_hex, |
1083 | .binary = trace_special_bin, | 1107 | .binary = trace_special_bin, |
1084 | }; | 1108 | }; |
1085 | 1109 | ||
1110 | static struct trace_event trace_special_event = { | ||
1111 | .type = TRACE_SPECIAL, | ||
1112 | .funcs = &trace_special_funcs, | ||
1113 | }; | ||
1114 | |||
1086 | /* TRACE_STACK */ | 1115 | /* TRACE_STACK */ |
1087 | 1116 | ||
1088 | static enum print_line_t trace_stack_print(struct trace_iterator *iter, | 1117 | static enum print_line_t trace_stack_print(struct trace_iterator *iter, |
1089 | int flags) | 1118 | int flags, struct trace_event *event) |
1090 | { | 1119 | { |
1091 | struct stack_entry *field; | 1120 | struct stack_entry *field; |
1092 | struct trace_seq *s = &iter->seq; | 1121 | struct trace_seq *s = &iter->seq; |
@@ -1114,17 +1143,21 @@ static enum print_line_t trace_stack_print(struct trace_iterator *iter, | |||
1114 | return TRACE_TYPE_PARTIAL_LINE; | 1143 | return TRACE_TYPE_PARTIAL_LINE; |
1115 | } | 1144 | } |
1116 | 1145 | ||
1117 | static struct trace_event trace_stack_event = { | 1146 | static struct trace_event_functions trace_stack_funcs = { |
1118 | .type = TRACE_STACK, | ||
1119 | .trace = trace_stack_print, | 1147 | .trace = trace_stack_print, |
1120 | .raw = trace_special_print, | 1148 | .raw = trace_special_print, |
1121 | .hex = trace_special_hex, | 1149 | .hex = trace_special_hex, |
1122 | .binary = trace_special_bin, | 1150 | .binary = trace_special_bin, |
1123 | }; | 1151 | }; |
1124 | 1152 | ||
1153 | static struct trace_event trace_stack_event = { | ||
1154 | .type = TRACE_STACK, | ||
1155 | .funcs = &trace_stack_funcs, | ||
1156 | }; | ||
1157 | |||
1125 | /* TRACE_USER_STACK */ | 1158 | /* TRACE_USER_STACK */ |
1126 | static enum print_line_t trace_user_stack_print(struct trace_iterator *iter, | 1159 | static enum print_line_t trace_user_stack_print(struct trace_iterator *iter, |
1127 | int flags) | 1160 | int flags, struct trace_event *event) |
1128 | { | 1161 | { |
1129 | struct userstack_entry *field; | 1162 | struct userstack_entry *field; |
1130 | struct trace_seq *s = &iter->seq; | 1163 | struct trace_seq *s = &iter->seq; |
@@ -1143,17 +1176,22 @@ static enum print_line_t trace_user_stack_print(struct trace_iterator *iter, | |||
1143 | return TRACE_TYPE_PARTIAL_LINE; | 1176 | return TRACE_TYPE_PARTIAL_LINE; |
1144 | } | 1177 | } |
1145 | 1178 | ||
1146 | static struct trace_event trace_user_stack_event = { | 1179 | static struct trace_event_functions trace_user_stack_funcs = { |
1147 | .type = TRACE_USER_STACK, | ||
1148 | .trace = trace_user_stack_print, | 1180 | .trace = trace_user_stack_print, |
1149 | .raw = trace_special_print, | 1181 | .raw = trace_special_print, |
1150 | .hex = trace_special_hex, | 1182 | .hex = trace_special_hex, |
1151 | .binary = trace_special_bin, | 1183 | .binary = trace_special_bin, |
1152 | }; | 1184 | }; |
1153 | 1185 | ||
1186 | static struct trace_event trace_user_stack_event = { | ||
1187 | .type = TRACE_USER_STACK, | ||
1188 | .funcs = &trace_user_stack_funcs, | ||
1189 | }; | ||
1190 | |||
1154 | /* TRACE_BPRINT */ | 1191 | /* TRACE_BPRINT */ |
1155 | static enum print_line_t | 1192 | static enum print_line_t |
1156 | trace_bprint_print(struct trace_iterator *iter, int flags) | 1193 | trace_bprint_print(struct trace_iterator *iter, int flags, |
1194 | struct trace_event *event) | ||
1157 | { | 1195 | { |
1158 | struct trace_entry *entry = iter->ent; | 1196 | struct trace_entry *entry = iter->ent; |
1159 | struct trace_seq *s = &iter->seq; | 1197 | struct trace_seq *s = &iter->seq; |
@@ -1178,7 +1216,8 @@ trace_bprint_print(struct trace_iterator *iter, int flags) | |||
1178 | 1216 | ||
1179 | 1217 | ||
1180 | static enum print_line_t | 1218 | static enum print_line_t |
1181 | trace_bprint_raw(struct trace_iterator *iter, int flags) | 1219 | trace_bprint_raw(struct trace_iterator *iter, int flags, |
1220 | struct trace_event *event) | ||
1182 | { | 1221 | { |
1183 | struct bprint_entry *field; | 1222 | struct bprint_entry *field; |
1184 | struct trace_seq *s = &iter->seq; | 1223 | struct trace_seq *s = &iter->seq; |
@@ -1197,16 +1236,19 @@ trace_bprint_raw(struct trace_iterator *iter, int flags) | |||
1197 | return TRACE_TYPE_PARTIAL_LINE; | 1236 | return TRACE_TYPE_PARTIAL_LINE; |
1198 | } | 1237 | } |
1199 | 1238 | ||
1239 | static struct trace_event_functions trace_bprint_funcs = { | ||
1240 | .trace = trace_bprint_print, | ||
1241 | .raw = trace_bprint_raw, | ||
1242 | }; | ||
1200 | 1243 | ||
1201 | static struct trace_event trace_bprint_event = { | 1244 | static struct trace_event trace_bprint_event = { |
1202 | .type = TRACE_BPRINT, | 1245 | .type = TRACE_BPRINT, |
1203 | .trace = trace_bprint_print, | 1246 | .funcs = &trace_bprint_funcs, |
1204 | .raw = trace_bprint_raw, | ||
1205 | }; | 1247 | }; |
1206 | 1248 | ||
1207 | /* TRACE_PRINT */ | 1249 | /* TRACE_PRINT */ |
1208 | static enum print_line_t trace_print_print(struct trace_iterator *iter, | 1250 | static enum print_line_t trace_print_print(struct trace_iterator *iter, |
1209 | int flags) | 1251 | int flags, struct trace_event *event) |
1210 | { | 1252 | { |
1211 | struct print_entry *field; | 1253 | struct print_entry *field; |
1212 | struct trace_seq *s = &iter->seq; | 1254 | struct trace_seq *s = &iter->seq; |
@@ -1225,7 +1267,8 @@ static enum print_line_t trace_print_print(struct trace_iterator *iter, | |||
1225 | return TRACE_TYPE_PARTIAL_LINE; | 1267 | return TRACE_TYPE_PARTIAL_LINE; |
1226 | } | 1268 | } |
1227 | 1269 | ||
1228 | static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags) | 1270 | static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags, |
1271 | struct trace_event *event) | ||
1229 | { | 1272 | { |
1230 | struct print_entry *field; | 1273 | struct print_entry *field; |
1231 | 1274 | ||
@@ -1240,12 +1283,16 @@ static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags) | |||
1240 | return TRACE_TYPE_PARTIAL_LINE; | 1283 | return TRACE_TYPE_PARTIAL_LINE; |
1241 | } | 1284 | } |
1242 | 1285 | ||
1243 | static struct trace_event trace_print_event = { | 1286 | static struct trace_event_functions trace_print_funcs = { |
1244 | .type = TRACE_PRINT, | ||
1245 | .trace = trace_print_print, | 1287 | .trace = trace_print_print, |
1246 | .raw = trace_print_raw, | 1288 | .raw = trace_print_raw, |
1247 | }; | 1289 | }; |
1248 | 1290 | ||
1291 | static struct trace_event trace_print_event = { | ||
1292 | .type = TRACE_PRINT, | ||
1293 | .funcs = &trace_print_funcs, | ||
1294 | }; | ||
1295 | |||
1249 | 1296 | ||
1250 | static struct trace_event *events[] __initdata = { | 1297 | static struct trace_event *events[] __initdata = { |
1251 | &trace_fn_event, | 1298 | &trace_fn_event, |
diff --git a/kernel/trace/trace_output.h b/kernel/trace/trace_output.h index 9d91c72ba38b..c038eba0492b 100644 --- a/kernel/trace/trace_output.h +++ b/kernel/trace/trace_output.h | |||
@@ -25,7 +25,7 @@ extern void trace_event_read_unlock(void); | |||
25 | extern struct trace_event *ftrace_find_event(int type); | 25 | extern struct trace_event *ftrace_find_event(int type); |
26 | 26 | ||
27 | extern enum print_line_t trace_nop_print(struct trace_iterator *iter, | 27 | extern enum print_line_t trace_nop_print(struct trace_iterator *iter, |
28 | int flags); | 28 | int flags, struct trace_event *event); |
29 | extern int | 29 | extern int |
30 | trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry); | 30 | trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry); |
31 | 31 | ||
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 1c1b9bf3ccc6..3751c81998cb 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
@@ -93,7 +93,8 @@ static struct syscall_metadata *syscall_nr_to_meta(int nr) | |||
93 | } | 93 | } |
94 | 94 | ||
95 | enum print_line_t | 95 | enum print_line_t |
96 | print_syscall_enter(struct trace_iterator *iter, int flags) | 96 | print_syscall_enter(struct trace_iterator *iter, int flags, |
97 | struct trace_event *event) | ||
97 | { | 98 | { |
98 | struct trace_seq *s = &iter->seq; | 99 | struct trace_seq *s = &iter->seq; |
99 | struct trace_entry *ent = iter->ent; | 100 | struct trace_entry *ent = iter->ent; |
@@ -145,7 +146,8 @@ end: | |||
145 | } | 146 | } |
146 | 147 | ||
147 | enum print_line_t | 148 | enum print_line_t |
148 | print_syscall_exit(struct trace_iterator *iter, int flags) | 149 | print_syscall_exit(struct trace_iterator *iter, int flags, |
150 | struct trace_event *event) | ||
149 | { | 151 | { |
150 | struct trace_seq *s = &iter->seq; | 152 | struct trace_seq *s = &iter->seq; |
151 | struct trace_entry *ent = iter->ent; | 153 | struct trace_entry *ent = iter->ent; |