diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/ftrace_event.h | 22 | ||||
-rw-r--r-- | include/linux/syscalls.h | 8 | ||||
-rw-r--r-- | include/linux/tracepoint.h | 49 | ||||
-rw-r--r-- | include/trace/events/syscalls.h | 3 | ||||
-rw-r--r-- | include/trace/ftrace.h | 15 |
5 files changed, 69 insertions, 28 deletions
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index cdc30111d2f8..d16da3e53bc7 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/percpu.h> | 7 | #include <linux/percpu.h> |
8 | #include <linux/hardirq.h> | 8 | #include <linux/hardirq.h> |
9 | #include <linux/perf_event.h> | 9 | #include <linux/perf_event.h> |
10 | #include <linux/tracepoint.h> | ||
10 | 11 | ||
11 | struct trace_array; | 12 | struct trace_array; |
12 | struct trace_buffer; | 13 | struct trace_buffer; |
@@ -232,6 +233,7 @@ enum { | |||
232 | TRACE_EVENT_FL_IGNORE_ENABLE_BIT, | 233 | TRACE_EVENT_FL_IGNORE_ENABLE_BIT, |
233 | TRACE_EVENT_FL_WAS_ENABLED_BIT, | 234 | TRACE_EVENT_FL_WAS_ENABLED_BIT, |
234 | TRACE_EVENT_FL_USE_CALL_FILTER_BIT, | 235 | TRACE_EVENT_FL_USE_CALL_FILTER_BIT, |
236 | TRACE_EVENT_FL_TRACEPOINT_BIT, | ||
235 | }; | 237 | }; |
236 | 238 | ||
237 | /* | 239 | /* |
@@ -244,6 +246,7 @@ enum { | |||
244 | * (used for module unloading, if a module event is enabled, | 246 | * (used for module unloading, if a module event is enabled, |
245 | * it is best to clear the buffers that used it). | 247 | * it is best to clear the buffers that used it). |
246 | * USE_CALL_FILTER - For ftrace internal events, don't use file filter | 248 | * USE_CALL_FILTER - For ftrace internal events, don't use file filter |
249 | * TRACEPOINT - Event is a tracepoint | ||
247 | */ | 250 | */ |
248 | enum { | 251 | enum { |
249 | TRACE_EVENT_FL_FILTERED = (1 << TRACE_EVENT_FL_FILTERED_BIT), | 252 | TRACE_EVENT_FL_FILTERED = (1 << TRACE_EVENT_FL_FILTERED_BIT), |
@@ -252,12 +255,17 @@ enum { | |||
252 | TRACE_EVENT_FL_IGNORE_ENABLE = (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT), | 255 | TRACE_EVENT_FL_IGNORE_ENABLE = (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT), |
253 | TRACE_EVENT_FL_WAS_ENABLED = (1 << TRACE_EVENT_FL_WAS_ENABLED_BIT), | 256 | TRACE_EVENT_FL_WAS_ENABLED = (1 << TRACE_EVENT_FL_WAS_ENABLED_BIT), |
254 | TRACE_EVENT_FL_USE_CALL_FILTER = (1 << TRACE_EVENT_FL_USE_CALL_FILTER_BIT), | 257 | TRACE_EVENT_FL_USE_CALL_FILTER = (1 << TRACE_EVENT_FL_USE_CALL_FILTER_BIT), |
258 | TRACE_EVENT_FL_TRACEPOINT = (1 << TRACE_EVENT_FL_TRACEPOINT_BIT), | ||
255 | }; | 259 | }; |
256 | 260 | ||
257 | struct ftrace_event_call { | 261 | struct ftrace_event_call { |
258 | struct list_head list; | 262 | struct list_head list; |
259 | struct ftrace_event_class *class; | 263 | struct ftrace_event_class *class; |
260 | char *name; | 264 | union { |
265 | char *name; | ||
266 | /* Set TRACE_EVENT_FL_TRACEPOINT flag when using "tp" */ | ||
267 | struct tracepoint *tp; | ||
268 | }; | ||
261 | struct trace_event event; | 269 | struct trace_event event; |
262 | const char *print_fmt; | 270 | const char *print_fmt; |
263 | struct event_filter *filter; | 271 | struct event_filter *filter; |
@@ -271,6 +279,7 @@ struct ftrace_event_call { | |||
271 | * bit 3: ftrace internal event (do not enable) | 279 | * bit 3: ftrace internal event (do not enable) |
272 | * bit 4: Event was enabled by module | 280 | * bit 4: Event was enabled by module |
273 | * bit 5: use call filter rather than file filter | 281 | * bit 5: use call filter rather than file filter |
282 | * bit 6: Event is a tracepoint | ||
274 | */ | 283 | */ |
275 | int flags; /* static flags of different events */ | 284 | int flags; /* static flags of different events */ |
276 | 285 | ||
@@ -283,6 +292,15 @@ struct ftrace_event_call { | |||
283 | #endif | 292 | #endif |
284 | }; | 293 | }; |
285 | 294 | ||
295 | static inline const char * | ||
296 | ftrace_event_name(struct ftrace_event_call *call) | ||
297 | { | ||
298 | if (call->flags & TRACE_EVENT_FL_TRACEPOINT) | ||
299 | return call->tp ? call->tp->name : NULL; | ||
300 | else | ||
301 | return call->name; | ||
302 | } | ||
303 | |||
286 | struct trace_array; | 304 | struct trace_array; |
287 | struct ftrace_subsystem_dir; | 305 | struct ftrace_subsystem_dir; |
288 | 306 | ||
@@ -353,7 +371,7 @@ struct ftrace_event_file { | |||
353 | #define __TRACE_EVENT_FLAGS(name, value) \ | 371 | #define __TRACE_EVENT_FLAGS(name, value) \ |
354 | static int __init trace_init_flags_##name(void) \ | 372 | static int __init trace_init_flags_##name(void) \ |
355 | { \ | 373 | { \ |
356 | event_##name.flags = value; \ | 374 | event_##name.flags |= value; \ |
357 | return 0; \ | 375 | return 0; \ |
358 | } \ | 376 | } \ |
359 | early_initcall(trace_init_flags_##name); | 377 | early_initcall(trace_init_flags_##name); |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 697ceb70a9a9..a4a0588c5397 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -119,8 +119,10 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
119 | static struct syscall_metadata __syscall_meta_##sname; \ | 119 | static struct syscall_metadata __syscall_meta_##sname; \ |
120 | static struct ftrace_event_call __used \ | 120 | static struct ftrace_event_call __used \ |
121 | event_enter_##sname = { \ | 121 | event_enter_##sname = { \ |
122 | .name = "sys_enter"#sname, \ | ||
123 | .class = &event_class_syscall_enter, \ | 122 | .class = &event_class_syscall_enter, \ |
123 | { \ | ||
124 | .name = "sys_enter"#sname, \ | ||
125 | }, \ | ||
124 | .event.funcs = &enter_syscall_print_funcs, \ | 126 | .event.funcs = &enter_syscall_print_funcs, \ |
125 | .data = (void *)&__syscall_meta_##sname,\ | 127 | .data = (void *)&__syscall_meta_##sname,\ |
126 | .flags = TRACE_EVENT_FL_CAP_ANY, \ | 128 | .flags = TRACE_EVENT_FL_CAP_ANY, \ |
@@ -133,8 +135,10 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
133 | static struct syscall_metadata __syscall_meta_##sname; \ | 135 | static struct syscall_metadata __syscall_meta_##sname; \ |
134 | static struct ftrace_event_call __used \ | 136 | static struct ftrace_event_call __used \ |
135 | event_exit_##sname = { \ | 137 | event_exit_##sname = { \ |
136 | .name = "sys_exit"#sname, \ | ||
137 | .class = &event_class_syscall_exit, \ | 138 | .class = &event_class_syscall_exit, \ |
139 | { \ | ||
140 | .name = "sys_exit"#sname, \ | ||
141 | }, \ | ||
138 | .event.funcs = &exit_syscall_print_funcs, \ | 142 | .event.funcs = &exit_syscall_print_funcs, \ |
139 | .data = (void *)&__syscall_meta_##sname,\ | 143 | .data = (void *)&__syscall_meta_##sname,\ |
140 | .flags = TRACE_EVENT_FL_CAP_ANY, \ | 144 | .flags = TRACE_EVENT_FL_CAP_ANY, \ |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 812b2553dfd8..9d30ee469c2a 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * | 6 | * |
7 | * See Documentation/trace/tracepoints.txt. | 7 | * See Documentation/trace/tracepoints.txt. |
8 | * | 8 | * |
9 | * (C) Copyright 2008 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> | 9 | * Copyright (C) 2008-2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
10 | * | 10 | * |
11 | * Heavily inspired from the Linux Kernel Markers. | 11 | * Heavily inspired from the Linux Kernel Markers. |
12 | * | 12 | * |
@@ -21,6 +21,7 @@ | |||
21 | 21 | ||
22 | struct module; | 22 | struct module; |
23 | struct tracepoint; | 23 | struct tracepoint; |
24 | struct notifier_block; | ||
24 | 25 | ||
25 | struct tracepoint_func { | 26 | struct tracepoint_func { |
26 | void *func; | 27 | void *func; |
@@ -35,31 +36,38 @@ struct tracepoint { | |||
35 | struct tracepoint_func __rcu *funcs; | 36 | struct tracepoint_func __rcu *funcs; |
36 | }; | 37 | }; |
37 | 38 | ||
38 | /* | ||
39 | * Connect a probe to a tracepoint. | ||
40 | * Internal API, should not be used directly. | ||
41 | */ | ||
42 | extern int tracepoint_probe_register(const char *name, void *probe, void *data); | ||
43 | |||
44 | /* | ||
45 | * Disconnect a probe from a tracepoint. | ||
46 | * Internal API, should not be used directly. | ||
47 | */ | ||
48 | extern int | 39 | extern int |
49 | tracepoint_probe_unregister(const char *name, void *probe, void *data); | 40 | tracepoint_probe_register(struct tracepoint *tp, void *probe, void *data); |
41 | extern int | ||
42 | tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data); | ||
43 | extern void | ||
44 | for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv), | ||
45 | void *priv); | ||
50 | 46 | ||
51 | #ifdef CONFIG_MODULES | 47 | #ifdef CONFIG_MODULES |
52 | struct tp_module { | 48 | struct tp_module { |
53 | struct list_head list; | 49 | struct list_head list; |
54 | unsigned int num_tracepoints; | 50 | struct module *mod; |
55 | struct tracepoint * const *tracepoints_ptrs; | ||
56 | }; | 51 | }; |
52 | |||
57 | bool trace_module_has_bad_taint(struct module *mod); | 53 | bool trace_module_has_bad_taint(struct module *mod); |
54 | extern int register_tracepoint_module_notifier(struct notifier_block *nb); | ||
55 | extern int unregister_tracepoint_module_notifier(struct notifier_block *nb); | ||
58 | #else | 56 | #else |
59 | static inline bool trace_module_has_bad_taint(struct module *mod) | 57 | static inline bool trace_module_has_bad_taint(struct module *mod) |
60 | { | 58 | { |
61 | return false; | 59 | return false; |
62 | } | 60 | } |
61 | static inline | ||
62 | int register_tracepoint_module_notifier(struct notifier_block *nb) | ||
63 | { | ||
64 | return 0; | ||
65 | } | ||
66 | static inline | ||
67 | int unregister_tracepoint_module_notifier(struct notifier_block *nb) | ||
68 | { | ||
69 | return 0; | ||
70 | } | ||
63 | #endif /* CONFIG_MODULES */ | 71 | #endif /* CONFIG_MODULES */ |
64 | 72 | ||
65 | /* | 73 | /* |
@@ -72,6 +80,11 @@ static inline void tracepoint_synchronize_unregister(void) | |||
72 | synchronize_sched(); | 80 | synchronize_sched(); |
73 | } | 81 | } |
74 | 82 | ||
83 | #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS | ||
84 | extern void syscall_regfunc(void); | ||
85 | extern void syscall_unregfunc(void); | ||
86 | #endif /* CONFIG_HAVE_SYSCALL_TRACEPOINTS */ | ||
87 | |||
75 | #define PARAMS(args...) args | 88 | #define PARAMS(args...) args |
76 | 89 | ||
77 | #endif /* _LINUX_TRACEPOINT_H */ | 90 | #endif /* _LINUX_TRACEPOINT_H */ |
@@ -160,14 +173,14 @@ static inline void tracepoint_synchronize_unregister(void) | |||
160 | static inline int \ | 173 | static inline int \ |
161 | register_trace_##name(void (*probe)(data_proto), void *data) \ | 174 | register_trace_##name(void (*probe)(data_proto), void *data) \ |
162 | { \ | 175 | { \ |
163 | return tracepoint_probe_register(#name, (void *)probe, \ | 176 | return tracepoint_probe_register(&__tracepoint_##name, \ |
164 | data); \ | 177 | (void *)probe, data); \ |
165 | } \ | 178 | } \ |
166 | static inline int \ | 179 | static inline int \ |
167 | unregister_trace_##name(void (*probe)(data_proto), void *data) \ | 180 | unregister_trace_##name(void (*probe)(data_proto), void *data) \ |
168 | { \ | 181 | { \ |
169 | return tracepoint_probe_unregister(#name, (void *)probe, \ | 182 | return tracepoint_probe_unregister(&__tracepoint_##name,\ |
170 | data); \ | 183 | (void *)probe, data); \ |
171 | } \ | 184 | } \ |
172 | static inline void \ | 185 | static inline void \ |
173 | check_trace_callback_type_##name(void (*cb)(data_proto)) \ | 186 | check_trace_callback_type_##name(void (*cb)(data_proto)) \ |
diff --git a/include/trace/events/syscalls.h b/include/trace/events/syscalls.h index 5a4c04a75b3d..14e49c798135 100644 --- a/include/trace/events/syscalls.h +++ b/include/trace/events/syscalls.h | |||
@@ -13,9 +13,6 @@ | |||
13 | 13 | ||
14 | #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS | 14 | #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS |
15 | 15 | ||
16 | extern void syscall_regfunc(void); | ||
17 | extern void syscall_unregfunc(void); | ||
18 | |||
19 | TRACE_EVENT_FN(sys_enter, | 16 | TRACE_EVENT_FN(sys_enter, |
20 | 17 | ||
21 | TP_PROTO(struct pt_regs *regs, long id), | 18 | TP_PROTO(struct pt_regs *regs, long id), |
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index 8765126b328c..0a1a4f7caf09 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h | |||
@@ -470,10 +470,13 @@ static inline notrace int ftrace_get_offsets_##call( \ | |||
470 | * }; | 470 | * }; |
471 | * | 471 | * |
472 | * static struct ftrace_event_call event_<call> = { | 472 | * static struct ftrace_event_call event_<call> = { |
473 | * .name = "<call>", | ||
474 | * .class = event_class_<template>, | 473 | * .class = event_class_<template>, |
474 | * { | ||
475 | * .tp = &__tracepoint_<call>, | ||
476 | * }, | ||
475 | * .event = &ftrace_event_type_<call>, | 477 | * .event = &ftrace_event_type_<call>, |
476 | * .print_fmt = print_fmt_<call>, | 478 | * .print_fmt = print_fmt_<call>, |
479 | * .flags = TRACE_EVENT_FL_TRACEPOINT, | ||
477 | * }; | 480 | * }; |
478 | * // its only safe to use pointers when doing linker tricks to | 481 | * // its only safe to use pointers when doing linker tricks to |
479 | * // create an array. | 482 | * // create an array. |
@@ -605,10 +608,13 @@ static struct ftrace_event_class __used __refdata event_class_##call = { \ | |||
605 | #define DEFINE_EVENT(template, call, proto, args) \ | 608 | #define DEFINE_EVENT(template, call, proto, args) \ |
606 | \ | 609 | \ |
607 | static struct ftrace_event_call __used event_##call = { \ | 610 | static struct ftrace_event_call __used event_##call = { \ |
608 | .name = #call, \ | ||
609 | .class = &event_class_##template, \ | 611 | .class = &event_class_##template, \ |
612 | { \ | ||
613 | .tp = &__tracepoint_##call, \ | ||
614 | }, \ | ||
610 | .event.funcs = &ftrace_event_type_funcs_##template, \ | 615 | .event.funcs = &ftrace_event_type_funcs_##template, \ |
611 | .print_fmt = print_fmt_##template, \ | 616 | .print_fmt = print_fmt_##template, \ |
617 | .flags = TRACE_EVENT_FL_TRACEPOINT, \ | ||
612 | }; \ | 618 | }; \ |
613 | static struct ftrace_event_call __used \ | 619 | static struct ftrace_event_call __used \ |
614 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call | 620 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call |
@@ -619,10 +625,13 @@ __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call | |||
619 | static const char print_fmt_##call[] = print; \ | 625 | static const char print_fmt_##call[] = print; \ |
620 | \ | 626 | \ |
621 | static struct ftrace_event_call __used event_##call = { \ | 627 | static struct ftrace_event_call __used event_##call = { \ |
622 | .name = #call, \ | ||
623 | .class = &event_class_##template, \ | 628 | .class = &event_class_##template, \ |
629 | { \ | ||
630 | .tp = &__tracepoint_##call, \ | ||
631 | }, \ | ||
624 | .event.funcs = &ftrace_event_type_funcs_##call, \ | 632 | .event.funcs = &ftrace_event_type_funcs_##call, \ |
625 | .print_fmt = print_fmt_##call, \ | 633 | .print_fmt = print_fmt_##call, \ |
634 | .flags = TRACE_EVENT_FL_TRACEPOINT, \ | ||
626 | }; \ | 635 | }; \ |
627 | static struct ftrace_event_call __used \ | 636 | static struct ftrace_event_call __used \ |
628 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call | 637 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call |