diff options
| author | Jason Baron <jbaron@redhat.com> | 2009-08-10 16:52:27 -0400 |
|---|---|---|
| committer | Frederic Weisbecker <fweisbec@gmail.com> | 2009-08-11 14:35:26 -0400 |
| commit | 63fbdab3157b72467013fe4dcf88c85e45280ef7 (patch) | |
| tree | c0e8647e18528dca9682e98a441729adfa41696c /include | |
| parent | 066e0378c23f0a3db730893f6a041e4a3922a385 (diff) | |
tracing: Add DECLARE_TRACE_WITH_CALLBACK() macro
Introduce a new 'DECLARE_TRACE_WITH_CALLBACK()' macro, so that
tracepoints can associate an external register/unregister function.
This prepares for the syscalls tracer conversion to trace events. We
will need to perform arch level operations once a syscall event is
turned on/off, such as TIF flags setting, hence the need of such
specific callbacks.
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 'include')
| -rw-r--r-- | include/linux/tracepoint.h | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index b9dc4ca0246f..5984ed04c03b 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
| @@ -60,8 +60,10 @@ struct tracepoint { | |||
| 60 | * Make sure the alignment of the structure in the __tracepoints section will | 60 | * Make sure the alignment of the structure in the __tracepoints section will |
| 61 | * not add unwanted padding between the beginning of the section and the | 61 | * not add unwanted padding between the beginning of the section and the |
| 62 | * structure. Force alignment to the same alignment as the section start. | 62 | * structure. Force alignment to the same alignment as the section start. |
| 63 | * An optional set of (un)registration functions can be passed to perform any | ||
| 64 | * additional (un)registration work. | ||
| 63 | */ | 65 | */ |
| 64 | #define DECLARE_TRACE(name, proto, args) \ | 66 | #define DECLARE_TRACE_WITH_CALLBACK(name, proto, args, reg, unreg) \ |
| 65 | extern struct tracepoint __tracepoint_##name; \ | 67 | extern struct tracepoint __tracepoint_##name; \ |
| 66 | static inline void trace_##name(proto) \ | 68 | static inline void trace_##name(proto) \ |
| 67 | { \ | 69 | { \ |
| @@ -71,13 +73,30 @@ struct tracepoint { | |||
| 71 | } \ | 73 | } \ |
| 72 | static inline int register_trace_##name(void (*probe)(proto)) \ | 74 | static inline int register_trace_##name(void (*probe)(proto)) \ |
| 73 | { \ | 75 | { \ |
| 74 | return tracepoint_probe_register(#name, (void *)probe); \ | 76 | int ret; \ |
| 77 | void (*func)(void) = reg; \ | ||
| 78 | \ | ||
| 79 | ret = tracepoint_probe_register(#name, (void *)probe); \ | ||
| 80 | if (func && !ret) \ | ||
| 81 | func(); \ | ||
| 82 | return ret; \ | ||
| 75 | } \ | 83 | } \ |
| 76 | static inline int unregister_trace_##name(void (*probe)(proto)) \ | 84 | static inline int unregister_trace_##name(void (*probe)(proto)) \ |
| 77 | { \ | 85 | { \ |
| 78 | return tracepoint_probe_unregister(#name, (void *)probe);\ | 86 | int ret; \ |
| 87 | void (*func)(void) = unreg; \ | ||
| 88 | \ | ||
| 89 | ret = tracepoint_probe_unregister(#name, (void *)probe);\ | ||
| 90 | if (func && !ret) \ | ||
| 91 | func(); \ | ||
| 92 | return ret; \ | ||
| 79 | } | 93 | } |
| 80 | 94 | ||
| 95 | |||
| 96 | #define DECLARE_TRACE(name, proto, args) \ | ||
| 97 | DECLARE_TRACE_WITH_CALLBACK(name, TP_PROTO(proto), TP_ARGS(args),\ | ||
| 98 | NULL, NULL); | ||
| 99 | |||
| 81 | #define DEFINE_TRACE(name) \ | 100 | #define DEFINE_TRACE(name) \ |
| 82 | static const char __tpstrtab_##name[] \ | 101 | static const char __tpstrtab_##name[] \ |
| 83 | __attribute__((section("__tracepoints_strings"))) = #name; \ | 102 | __attribute__((section("__tracepoints_strings"))) = #name; \ |
| @@ -94,7 +113,7 @@ extern void tracepoint_update_probe_range(struct tracepoint *begin, | |||
| 94 | struct tracepoint *end); | 113 | struct tracepoint *end); |
| 95 | 114 | ||
| 96 | #else /* !CONFIG_TRACEPOINTS */ | 115 | #else /* !CONFIG_TRACEPOINTS */ |
| 97 | #define DECLARE_TRACE(name, proto, args) \ | 116 | #define DECLARE_TRACE_WITH_CALLBACK(name, proto, args, reg, unreg) \ |
| 98 | static inline void _do_trace_##name(struct tracepoint *tp, proto) \ | 117 | static inline void _do_trace_##name(struct tracepoint *tp, proto) \ |
| 99 | { } \ | 118 | { } \ |
| 100 | static inline void trace_##name(proto) \ | 119 | static inline void trace_##name(proto) \ |
| @@ -108,6 +127,10 @@ extern void tracepoint_update_probe_range(struct tracepoint *begin, | |||
| 108 | return -ENOSYS; \ | 127 | return -ENOSYS; \ |
| 109 | } | 128 | } |
| 110 | 129 | ||
| 130 | #define DECLARE_TRACE(name, proto, args) \ | ||
| 131 | DECLARE_TRACE_WITH_CALLBACK(name, TP_PROTO(proto), TP_ARGS(args),\ | ||
| 132 | NULL, NULL); | ||
| 133 | |||
| 111 | #define DEFINE_TRACE(name) | 134 | #define DEFINE_TRACE(name) |
| 112 | #define EXPORT_TRACEPOINT_SYMBOL_GPL(name) | 135 | #define EXPORT_TRACEPOINT_SYMBOL_GPL(name) |
| 113 | #define EXPORT_TRACEPOINT_SYMBOL(name) | 136 | #define EXPORT_TRACEPOINT_SYMBOL(name) |
