diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-14 13:49:03 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-14 13:49:03 -0400 |
commit | eeee78cf77df0450ca285a7cd6d73842181e825c (patch) | |
tree | 330540323eae82977756e5086492654b9e461871 /include/linux | |
parent | 3f3c73de77b5598e9f87812ac4da9445090c3b4a (diff) | |
parent | 9828413d4715d4ed12bc92b161f4ed377d777ffb (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 'include/linux')
-rw-r--r-- | include/linux/ftrace_event.h | 4 | ||||
-rw-r--r-- | include/linux/module.h | 2 | ||||
-rw-r--r-- | include/linux/tracepoint.h | 8 |
3 files changed, 12 insertions, 2 deletions
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index c674ee8f7fca..112cf49d9576 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
@@ -202,7 +202,7 @@ enum trace_reg { | |||
202 | struct ftrace_event_call; | 202 | struct ftrace_event_call; |
203 | 203 | ||
204 | struct ftrace_event_class { | 204 | struct ftrace_event_class { |
205 | char *system; | 205 | const char *system; |
206 | void *probe; | 206 | void *probe; |
207 | #ifdef CONFIG_PERF_EVENTS | 207 | #ifdef CONFIG_PERF_EVENTS |
208 | void *perf_probe; | 208 | void *perf_probe; |
@@ -285,7 +285,7 @@ struct ftrace_event_call { | |||
285 | struct tracepoint *tp; | 285 | struct tracepoint *tp; |
286 | }; | 286 | }; |
287 | struct trace_event event; | 287 | struct trace_event event; |
288 | const char *print_fmt; | 288 | char *print_fmt; |
289 | struct event_filter *filter; | 289 | struct event_filter *filter; |
290 | void *mod; | 290 | void *mod; |
291 | void *data; | 291 | void *data; |
diff --git a/include/linux/module.h b/include/linux/module.h index b03485bcb82a..c883b86ea964 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
@@ -338,6 +338,8 @@ struct module { | |||
338 | #ifdef CONFIG_EVENT_TRACING | 338 | #ifdef CONFIG_EVENT_TRACING |
339 | struct ftrace_event_call **trace_events; | 339 | struct ftrace_event_call **trace_events; |
340 | unsigned int num_trace_events; | 340 | unsigned int num_trace_events; |
341 | struct trace_enum_map **trace_enums; | ||
342 | unsigned int num_trace_enums; | ||
341 | #endif | 343 | #endif |
342 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD | 344 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD |
343 | unsigned int num_ftrace_callsites; | 345 | unsigned int num_ftrace_callsites; |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index c72851328ca9..a5f7f3ecafa3 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
@@ -36,6 +36,12 @@ struct tracepoint { | |||
36 | struct tracepoint_func __rcu *funcs; | 36 | struct tracepoint_func __rcu *funcs; |
37 | }; | 37 | }; |
38 | 38 | ||
39 | struct trace_enum_map { | ||
40 | const char *system; | ||
41 | const char *enum_string; | ||
42 | unsigned long enum_value; | ||
43 | }; | ||
44 | |||
39 | extern int | 45 | extern int |
40 | tracepoint_probe_register(struct tracepoint *tp, void *probe, void *data); | 46 | tracepoint_probe_register(struct tracepoint *tp, void *probe, void *data); |
41 | extern int | 47 | extern int |
@@ -87,6 +93,8 @@ extern void syscall_unregfunc(void); | |||
87 | 93 | ||
88 | #define PARAMS(args...) args | 94 | #define PARAMS(args...) args |
89 | 95 | ||
96 | #define TRACE_DEFINE_ENUM(x) | ||
97 | |||
90 | #endif /* _LINUX_TRACEPOINT_H */ | 98 | #endif /* _LINUX_TRACEPOINT_H */ |
91 | 99 | ||
92 | /* | 100 | /* |