aboutsummaryrefslogtreecommitdiffstats
path: root/samples
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-04-14 13:49:03 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-04-14 13:49:03 -0400
commiteeee78cf77df0450ca285a7cd6d73842181e825c (patch)
tree330540323eae82977756e5086492654b9e461871 /samples
parent3f3c73de77b5598e9f87812ac4da9445090c3b4a (diff)
parent9828413d4715d4ed12bc92b161f4ed377d777ffb (diff)
Merge tag 'trace-v4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Pull tracing updates from Steven Rostedt: "Some clean ups and small fixes, but the biggest change is the addition of the TRACE_DEFINE_ENUM() macro that can be used by tracepoints. Tracepoints have helper functions for the TP_printk() called __print_symbolic() and __print_flags() that lets a numeric number be displayed as a a human comprehensible text. What is placed in the TP_printk() is also shown in the tracepoint format file such that user space tools like perf and trace-cmd can parse the binary data and express the values too. Unfortunately, the way the TRACE_EVENT() macro works, anything placed in the TP_printk() will be shown pretty much exactly as is. The problem arises when enums are used. That's because unlike macros, enums will not be changed into their values by the C pre-processor. Thus, the enum string is exported to the format file, and this makes it useless for user space tools. The TRACE_DEFINE_ENUM() solves this by converting the enum strings in the TP_printk() format into their number, and that is what is shown to user space. For example, the tracepoint tlb_flush currently has this in its format file: __print_symbolic(REC->reason, { TLB_FLUSH_ON_TASK_SWITCH, "flush on task switch" }, { TLB_REMOTE_SHOOTDOWN, "remote shootdown" }, { TLB_LOCAL_SHOOTDOWN, "local shootdown" }, { TLB_LOCAL_MM_SHOOTDOWN, "local mm shootdown" }) After adding: TRACE_DEFINE_ENUM(TLB_FLUSH_ON_TASK_SWITCH); TRACE_DEFINE_ENUM(TLB_REMOTE_SHOOTDOWN); TRACE_DEFINE_ENUM(TLB_LOCAL_SHOOTDOWN); TRACE_DEFINE_ENUM(TLB_LOCAL_MM_SHOOTDOWN); Its format file will contain this: __print_symbolic(REC->reason, { 0, "flush on task switch" }, { 1, "remote shootdown" }, { 2, "local shootdown" }, { 3, "local mm shootdown" })" * tag 'trace-v4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (27 commits) tracing: Add enum_map file to show enums that have been mapped writeback: Export enums used by tracepoint to user space v4l: Export enums used by tracepoints to user space SUNRPC: Export enums in tracepoints to user space mm: tracing: Export enums in tracepoints to user space irq/tracing: Export enums in tracepoints to user space f2fs: Export the enums in the tracepoints to userspace net/9p/tracing: Export enums in tracepoints to userspace x86/tlb/trace: Export enums in used by tlb_flush tracepoint tracing/samples: Update the trace-event-sample.h with TRACE_DEFINE_ENUM() tracing: Allow for modules to convert their enums to values tracing: Add TRACE_DEFINE_ENUM() macro to map enums to their values tracing: Update trace-event-sample with TRACE_SYSTEM_VAR documentation tracing: Give system name a pointer brcmsmac: Move each system tracepoints to their own header iwlwifi: Move each system tracepoints to their own header mac80211: Move message tracepoints to their own header tracing: Add TRACE_SYSTEM_VAR to xhci-hcd tracing: Add TRACE_SYSTEM_VAR to kvm-s390 tracing: Add TRACE_SYSTEM_VAR to intel-sst ...
Diffstat (limited to 'samples')
-rw-r--r--samples/trace_events/trace-events-sample.h84
1 files changed, 82 insertions, 2 deletions
diff --git a/samples/trace_events/trace-events-sample.h b/samples/trace_events/trace-events-sample.h
index a2c8b02b6359..8965d1bb8811 100644
--- a/samples/trace_events/trace-events-sample.h
+++ b/samples/trace_events/trace-events-sample.h
@@ -22,7 +22,25 @@
22 * protection, just like TRACE_INCLUDE_FILE. 22 * protection, just like TRACE_INCLUDE_FILE.
23 */ 23 */
24#undef TRACE_SYSTEM 24#undef TRACE_SYSTEM
25#define TRACE_SYSTEM sample 25#define TRACE_SYSTEM sample-trace
26
27/*
28 * TRACE_SYSTEM is expected to be a C valid variable (alpha-numeric
29 * and underscore), although it may start with numbers. If for some
30 * reason it is not, you need to add the following lines:
31 */
32#undef TRACE_SYSTEM_VAR
33#define TRACE_SYSTEM_VAR sample_trace
34/*
35 * But the above is only needed if TRACE_SYSTEM is not alpha-numeric
36 * and underscored. By default, TRACE_SYSTEM_VAR will be equal to
37 * TRACE_SYSTEM. As TRACE_SYSTEM_VAR must be alpha-numeric, if
38 * TRACE_SYSTEM is not, then TRACE_SYSTEM_VAR must be defined with
39 * only alpha-numeric and underscores.
40 *
41 * The TRACE_SYSTEM_VAR is only used internally and not visible to
42 * user space.
43 */
26 44
27/* 45/*
28 * Notice that this file is not protected like a normal header. 46 * Notice that this file is not protected like a normal header.
@@ -180,8 +198,30 @@ static inline int __length_of(const int *list)
180 ; 198 ;
181 return i; 199 return i;
182} 200}
201
202enum {
203 TRACE_SAMPLE_FOO = 2,
204 TRACE_SAMPLE_BAR = 4,
205 TRACE_SAMPLE_ZOO = 8,
206};
183#endif 207#endif
184 208
209/*
210 * If enums are used in the TP_printk(), their names will be shown in
211 * format files and not their values. This can cause problems with user
212 * space programs that parse the format files to know how to translate
213 * the raw binary trace output into human readable text.
214 *
215 * To help out user space programs, any enum that is used in the TP_printk()
216 * should be defined by TRACE_DEFINE_ENUM() macro. All that is needed to
217 * be done is to add this macro with the enum within it in the trace
218 * header file, and it will be converted in the output.
219 */
220
221TRACE_DEFINE_ENUM(TRACE_SAMPLE_FOO);
222TRACE_DEFINE_ENUM(TRACE_SAMPLE_BAR);
223TRACE_DEFINE_ENUM(TRACE_SAMPLE_ZOO);
224
185TRACE_EVENT(foo_bar, 225TRACE_EVENT(foo_bar,
186 226
187 TP_PROTO(const char *foo, int bar, const int *lst, 227 TP_PROTO(const char *foo, int bar, const int *lst,
@@ -206,7 +246,47 @@ TRACE_EVENT(foo_bar,
206 __assign_bitmask(cpus, cpumask_bits(mask), num_possible_cpus()); 246 __assign_bitmask(cpus, cpumask_bits(mask), num_possible_cpus());
207 ), 247 ),
208 248
209 TP_printk("foo %s %d %s %s (%s)", __entry->foo, __entry->bar, 249 TP_printk("foo %s %d %s %s %s %s (%s)", __entry->foo, __entry->bar,
250
251/*
252 * Notice here the use of some helper functions. This includes:
253 *
254 * __print_symbolic( variable, { value, "string" }, ... ),
255 *
256 * The variable is tested against each value of the { } pair. If
257 * the variable matches one of the values, then it will print the
258 * string in that pair. If non are matched, it returns a string
259 * version of the number (if __entry->bar == 7 then "7" is returned).
260 */
261 __print_symbolic(__entry->bar,
262 { 0, "zero" },
263 { TRACE_SAMPLE_FOO, "TWO" },
264 { TRACE_SAMPLE_BAR, "FOUR" },
265 { TRACE_SAMPLE_ZOO, "EIGHT" },
266 { 10, "TEN" }
267 ),
268
269/*
270 * __print_flags( variable, "delim", { value, "flag" }, ... ),
271 *
272 * This is similar to __print_symbolic, except that it tests the bits
273 * of the value. If ((FLAG & variable) == FLAG) then the string is
274 * printed. If more than one flag matches, then each one that does is
275 * also printed with delim in between them.
276 * If not all bits are accounted for, then the not found bits will be
277 * added in hex format: 0x506 will show BIT2|BIT4|0x500
278 */
279 __print_flags(__entry->bar, "|",
280 { 1, "BIT1" },
281 { 2, "BIT2" },
282 { 4, "BIT3" },
283 { 8, "BIT4" }
284 ),
285/*
286 * __print_array( array, len, element_size )
287 *
288 * This prints out the array that is defined by __array in a nice format.
289 */
210 __print_array(__get_dynamic_array(list), 290 __print_array(__get_dynamic_array(list),
211 __get_dynamic_array_len(list), 291 __get_dynamic_array_len(list),
212 sizeof(int)), 292 sizeof(int)),