diff options
-rw-r--r-- | include/linux/tracepoint.h | 2 | ||||
-rw-r--r-- | include/trace/define_trace.h | 5 | ||||
-rw-r--r-- | include/trace/ftrace.h | 123 |
3 files changed, 126 insertions, 4 deletions
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 88a5b5a809ec..7063383cca13 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
@@ -283,6 +283,8 @@ static inline void tracepoint_synchronize_unregister(void) | |||
283 | #define TRACE_EVENT_TEMPLATE(name, proto, args, tstruct, assign, print) | 283 | #define TRACE_EVENT_TEMPLATE(name, proto, args, tstruct, assign, print) |
284 | #define DEFINE_EVENT(template, name, proto, args) \ | 284 | #define DEFINE_EVENT(template, name, proto, args) \ |
285 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) | 285 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) |
286 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
287 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) | ||
286 | 288 | ||
287 | #define TRACE_EVENT(name, proto, args, struct, assign, print) \ | 289 | #define TRACE_EVENT(name, proto, args, struct, assign, print) \ |
288 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) | 290 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) |
diff --git a/include/trace/define_trace.h b/include/trace/define_trace.h index 244985814a43..5d7d855ae21e 100644 --- a/include/trace/define_trace.h +++ b/include/trace/define_trace.h | |||
@@ -35,6 +35,10 @@ | |||
35 | #define DEFINE_EVENT(template, name, proto, args) \ | 35 | #define DEFINE_EVENT(template, name, proto, args) \ |
36 | DEFINE_TRACE(name) | 36 | DEFINE_TRACE(name) |
37 | 37 | ||
38 | #undef DEFINE_EVENT_PRINT | ||
39 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
40 | DEFINE_TRACE(name) | ||
41 | |||
38 | #undef DECLARE_TRACE | 42 | #undef DECLARE_TRACE |
39 | #define DECLARE_TRACE(name, proto, args) \ | 43 | #define DECLARE_TRACE(name, proto, args) \ |
40 | DEFINE_TRACE(name) | 44 | DEFINE_TRACE(name) |
@@ -69,6 +73,7 @@ | |||
69 | #undef TRACE_EVENT_FN | 73 | #undef TRACE_EVENT_FN |
70 | #undef TRACE_EVENT_TEMPLATE | 74 | #undef TRACE_EVENT_TEMPLATE |
71 | #undef DEFINE_EVENT | 75 | #undef DEFINE_EVENT |
76 | #undef DEFINE_EVENT_PRINT | ||
72 | #undef TRACE_HEADER_MULTI_READ | 77 | #undef TRACE_HEADER_MULTI_READ |
73 | 78 | ||
74 | /* Only undef what we defined in this file */ | 79 | /* Only undef what we defined in this file */ |
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index 2969f65d8002..b0461772bc8d 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h | |||
@@ -67,6 +67,10 @@ | |||
67 | #define DEFINE_EVENT(template, name, proto, args) \ | 67 | #define DEFINE_EVENT(template, name, proto, args) \ |
68 | static struct ftrace_event_call event_##name | 68 | static struct ftrace_event_call event_##name |
69 | 69 | ||
70 | #undef DEFINE_EVENT_PRINT | ||
71 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
72 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | ||
73 | |||
70 | #undef __cpparg | 74 | #undef __cpparg |
71 | #define __cpparg(arg...) arg | 75 | #define __cpparg(arg...) arg |
72 | 76 | ||
@@ -120,6 +124,10 @@ | |||
120 | #undef DEFINE_EVENT | 124 | #undef DEFINE_EVENT |
121 | #define DEFINE_EVENT(template, name, proto, args) | 125 | #define DEFINE_EVENT(template, name, proto, args) |
122 | 126 | ||
127 | #undef DEFINE_EVENT_PRINT | ||
128 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
129 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | ||
130 | |||
123 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 131 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
124 | 132 | ||
125 | /* | 133 | /* |
@@ -198,15 +206,28 @@ | |||
198 | #undef TRACE_EVENT_TEMPLATE | 206 | #undef TRACE_EVENT_TEMPLATE |
199 | #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, func, print) \ | 207 | #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, func, print) \ |
200 | static int \ | 208 | static int \ |
201 | ftrace_format_##call(struct ftrace_event_call *unused, \ | 209 | ftrace_format_setup_##call(struct ftrace_event_call *unused, \ |
202 | struct trace_seq *s) \ | 210 | struct trace_seq *s) \ |
203 | { \ | 211 | { \ |
204 | struct ftrace_raw_##call field __attribute__((unused)); \ | 212 | struct ftrace_raw_##call field __attribute__((unused)); \ |
205 | int ret = 0; \ | 213 | int ret = 0; \ |
206 | \ | 214 | \ |
207 | tstruct; \ | 215 | tstruct; \ |
208 | \ | 216 | \ |
209 | trace_seq_printf(s, "\nprint fmt: " print); \ | 217 | return ret; \ |
218 | } \ | ||
219 | \ | ||
220 | static int \ | ||
221 | ftrace_format_##call(struct ftrace_event_call *unused, \ | ||
222 | struct trace_seq *s) \ | ||
223 | { \ | ||
224 | int ret = 0; \ | ||
225 | \ | ||
226 | ret = ftrace_format_setup_##call(unused, s); \ | ||
227 | if (!ret) \ | ||
228 | return ret; \ | ||
229 | \ | ||
230 | ret = trace_seq_printf(s, "\nprint fmt: " print); \ | ||
210 | \ | 231 | \ |
211 | return ret; \ | 232 | return ret; \ |
212 | } | 233 | } |
@@ -214,6 +235,23 @@ ftrace_format_##call(struct ftrace_event_call *unused, \ | |||
214 | #undef DEFINE_EVENT | 235 | #undef DEFINE_EVENT |
215 | #define DEFINE_EVENT(template, name, proto, args) | 236 | #define DEFINE_EVENT(template, name, proto, args) |
216 | 237 | ||
238 | #undef DEFINE_EVENT_PRINT | ||
239 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
240 | static int \ | ||
241 | ftrace_format_##name(struct ftrace_event_call *unused, \ | ||
242 | struct trace_seq *s) \ | ||
243 | { \ | ||
244 | int ret = 0; \ | ||
245 | \ | ||
246 | ret = ftrace_format_setup_##template(unused, s); \ | ||
247 | if (!ret) \ | ||
248 | return ret; \ | ||
249 | \ | ||
250 | trace_seq_printf(s, "\nprint fmt: " print); \ | ||
251 | \ | ||
252 | return ret; \ | ||
253 | } | ||
254 | |||
217 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 255 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
218 | 256 | ||
219 | /* | 257 | /* |
@@ -325,6 +363,38 @@ ftrace_raw_output_##name(struct trace_iterator *iter, int flags) \ | |||
325 | #name, iter, flags); \ | 363 | #name, iter, flags); \ |
326 | } | 364 | } |
327 | 365 | ||
366 | #undef DEFINE_EVENT_PRINT | ||
367 | #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ | ||
368 | static enum print_line_t \ | ||
369 | ftrace_raw_output_##call(struct trace_iterator *iter, int flags) \ | ||
370 | { \ | ||
371 | struct trace_seq *s = &iter->seq; \ | ||
372 | struct ftrace_raw_##template *field; \ | ||
373 | struct trace_entry *entry; \ | ||
374 | struct trace_seq *p; \ | ||
375 | int ret; \ | ||
376 | \ | ||
377 | entry = iter->ent; \ | ||
378 | \ | ||
379 | if (entry->type != event_##call.id) { \ | ||
380 | WARN_ON_ONCE(1); \ | ||
381 | return TRACE_TYPE_UNHANDLED; \ | ||
382 | } \ | ||
383 | \ | ||
384 | field = (typeof(field))entry; \ | ||
385 | \ | ||
386 | p = &get_cpu_var(ftrace_event_seq); \ | ||
387 | trace_seq_init(p); \ | ||
388 | ret = trace_seq_printf(s, "%s: ", #call); \ | ||
389 | if (ret) \ | ||
390 | ret = trace_seq_printf(s, print); \ | ||
391 | put_cpu(); \ | ||
392 | if (!ret) \ | ||
393 | return TRACE_TYPE_PARTIAL_LINE; \ | ||
394 | \ | ||
395 | return TRACE_TYPE_HANDLED; \ | ||
396 | } | ||
397 | |||
328 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 398 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
329 | 399 | ||
330 | #undef __field_ext | 400 | #undef __field_ext |
@@ -378,6 +448,10 @@ ftrace_define_fields_##call(struct ftrace_event_call *event_call) \ | |||
378 | #undef DEFINE_EVENT | 448 | #undef DEFINE_EVENT |
379 | #define DEFINE_EVENT(template, name, proto, args) | 449 | #define DEFINE_EVENT(template, name, proto, args) |
380 | 450 | ||
451 | #undef DEFINE_EVENT_PRINT | ||
452 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
453 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | ||
454 | |||
381 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 455 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
382 | 456 | ||
383 | /* | 457 | /* |
@@ -422,6 +496,10 @@ static inline int ftrace_get_offsets_##call( \ | |||
422 | #undef DEFINE_EVENT | 496 | #undef DEFINE_EVENT |
423 | #define DEFINE_EVENT(template, name, proto, args) | 497 | #define DEFINE_EVENT(template, name, proto, args) |
424 | 498 | ||
499 | #undef DEFINE_EVENT_PRINT | ||
500 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
501 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | ||
502 | |||
425 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 503 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
426 | 504 | ||
427 | #ifdef CONFIG_EVENT_PROFILE | 505 | #ifdef CONFIG_EVENT_PROFILE |
@@ -461,6 +539,10 @@ static void ftrace_profile_disable_##name(struct ftrace_event_call *unused)\ | |||
461 | unregister_trace_##name(ftrace_profile_##name); \ | 539 | unregister_trace_##name(ftrace_profile_##name); \ |
462 | } | 540 | } |
463 | 541 | ||
542 | #undef DEFINE_EVENT_PRINT | ||
543 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
544 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | ||
545 | |||
464 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 546 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
465 | 547 | ||
466 | #endif | 548 | #endif |
@@ -674,7 +756,19 @@ static int ftrace_raw_init_event_##call(struct ftrace_event_call *unused)\ | |||
674 | event_##call.id = id; \ | 756 | event_##call.id = id; \ |
675 | INIT_LIST_HEAD(&event_##call.fields); \ | 757 | INIT_LIST_HEAD(&event_##call.fields); \ |
676 | return 0; \ | 758 | return 0; \ |
677 | } \ | 759 | } |
760 | |||
761 | #undef DEFINE_EVENT_PRINT | ||
762 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
763 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | ||
764 | |||
765 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | ||
766 | |||
767 | #undef TRACE_EVENT_TEMPLATE | ||
768 | #define TRACE_EVENT_TEMPLATE(call, proto, args, tstruct, assign, print) | ||
769 | |||
770 | #undef DEFINE_EVENT | ||
771 | #define DEFINE_EVENT(template, call, proto, args) \ | ||
678 | \ | 772 | \ |
679 | static struct ftrace_event_call __used \ | 773 | static struct ftrace_event_call __used \ |
680 | __attribute__((__aligned__(4))) \ | 774 | __attribute__((__aligned__(4))) \ |
@@ -690,6 +784,23 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ | |||
690 | _TRACE_PROFILE_INIT(call) \ | 784 | _TRACE_PROFILE_INIT(call) \ |
691 | } | 785 | } |
692 | 786 | ||
787 | #undef DEFINE_EVENT_PRINT | ||
788 | #define DEFINE_EVENT_PRINT(template, call, proto, args, print) \ | ||
789 | \ | ||
790 | static struct ftrace_event_call __used \ | ||
791 | __attribute__((__aligned__(4))) \ | ||
792 | __attribute__((section("_ftrace_events"))) event_##call = { \ | ||
793 | .name = #call, \ | ||
794 | .system = __stringify(TRACE_SYSTEM), \ | ||
795 | .event = &ftrace_event_type_##call, \ | ||
796 | .raw_init = ftrace_raw_init_event_##call, \ | ||
797 | .regfunc = ftrace_raw_reg_event_##call, \ | ||
798 | .unregfunc = ftrace_raw_unreg_event_##call, \ | ||
799 | .show_format = ftrace_format_##call, \ | ||
800 | .define_fields = ftrace_define_fields_##template, \ | ||
801 | _TRACE_PROFILE_INIT(call) \ | ||
802 | } | ||
803 | |||
693 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 804 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
694 | 805 | ||
695 | /* | 806 | /* |
@@ -854,6 +965,10 @@ static void ftrace_profile_##call(proto) \ | |||
854 | ftrace_profile_templ_##template(event_call, args); \ | 965 | ftrace_profile_templ_##template(event_call, args); \ |
855 | } | 966 | } |
856 | 967 | ||
968 | #undef DEFINE_EVENT_PRINT | ||
969 | #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ | ||
970 | DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) | ||
971 | |||
857 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 972 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
858 | #endif /* CONFIG_EVENT_PROFILE */ | 973 | #endif /* CONFIG_EVENT_PROFILE */ |
859 | 974 | ||