diff options
-rw-r--r-- | Documentation/trace/tracepoints.txt | 24 | ||||
-rw-r--r-- | include/linux/tracepoint.h | 10 |
2 files changed, 34 insertions, 0 deletions
diff --git a/Documentation/trace/tracepoints.txt b/Documentation/trace/tracepoints.txt index 6b018b53177a..a3efac621c5a 100644 --- a/Documentation/trace/tracepoints.txt +++ b/Documentation/trace/tracepoints.txt | |||
@@ -115,6 +115,30 @@ If the tracepoint has to be used in kernel modules, an | |||
115 | EXPORT_TRACEPOINT_SYMBOL_GPL() or EXPORT_TRACEPOINT_SYMBOL() can be | 115 | EXPORT_TRACEPOINT_SYMBOL_GPL() or EXPORT_TRACEPOINT_SYMBOL() can be |
116 | used to export the defined tracepoints. | 116 | used to export the defined tracepoints. |
117 | 117 | ||
118 | If you need to do a bit of work for a tracepoint parameter, and | ||
119 | that work is only used for the tracepoint, that work can be encapsulated | ||
120 | within an if statement with the following: | ||
121 | |||
122 | if (trace_foo_bar_enabled()) { | ||
123 | int i; | ||
124 | int tot = 0; | ||
125 | |||
126 | for (i = 0; i < count; i++) | ||
127 | tot += calculate_nuggets(); | ||
128 | |||
129 | trace_foo_bar(tot); | ||
130 | } | ||
131 | |||
132 | All trace_<tracepoint>() calls have a matching trace_<tracepoint>_enabled() | ||
133 | function defined that returns true if the tracepoint is enabled and | ||
134 | false otherwise. The trace_<tracepoint>() should always be within the | ||
135 | block of the if (trace_<tracepoint>_enabled()) to prevent races between | ||
136 | the tracepoint being enabled and the check being seen. | ||
137 | |||
138 | The advantage of using the trace_<tracepoint>_enabled() is that it uses | ||
139 | the static_key of the tracepoint to allow the if statement to be implemented | ||
140 | with jump labels and avoid conditional branches. | ||
141 | |||
118 | Note: The convenience macro TRACE_EVENT provides an alternative way to | 142 | Note: The convenience macro TRACE_EVENT provides an alternative way to |
119 | define tracepoints. Check http://lwn.net/Articles/379903, | 143 | define tracepoints. Check http://lwn.net/Articles/379903, |
120 | http://lwn.net/Articles/381064 and http://lwn.net/Articles/383362 | 144 | http://lwn.net/Articles/381064 and http://lwn.net/Articles/383362 |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 9d30ee469c2a..2e2a5f7717e5 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
@@ -185,6 +185,11 @@ extern void syscall_unregfunc(void); | |||
185 | static inline void \ | 185 | static inline void \ |
186 | check_trace_callback_type_##name(void (*cb)(data_proto)) \ | 186 | check_trace_callback_type_##name(void (*cb)(data_proto)) \ |
187 | { \ | 187 | { \ |
188 | } \ | ||
189 | static inline bool \ | ||
190 | trace_##name##_enabled(void) \ | ||
191 | { \ | ||
192 | return static_key_false(&__tracepoint_##name.key); \ | ||
188 | } | 193 | } |
189 | 194 | ||
190 | /* | 195 | /* |
@@ -230,6 +235,11 @@ extern void syscall_unregfunc(void); | |||
230 | } \ | 235 | } \ |
231 | static inline void check_trace_callback_type_##name(void (*cb)(data_proto)) \ | 236 | static inline void check_trace_callback_type_##name(void (*cb)(data_proto)) \ |
232 | { \ | 237 | { \ |
238 | } \ | ||
239 | static inline bool \ | ||
240 | trace_##name##_enabled(void) \ | ||
241 | { \ | ||
242 | return false; \ | ||
233 | } | 243 | } |
234 | 244 | ||
235 | #define DEFINE_TRACE_FN(name, reg, unreg) | 245 | #define DEFINE_TRACE_FN(name, reg, unreg) |