mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
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" }) -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJVLBTuAAoJEEjnJuOKh9ldjHMIALdRS755TXCZGOf0r7O2akOR wMPeum7C+ae1mH+jCsJKUC0/jUfQKaMt/UxoHlipDgcGg8kD2jtGnGCw4Xlwvdsr y4rFmcTRSl1mo0zDSsg6ujoupHlVYN0+JPjrd7S3cv/llJoY49zcanNLF7S2XLeM dZCtWRLWYpBiWO68ai6AqJTnE/eGFIqBI048qb5Eg8dbK243SSeSIf9Ywhb+VsA+ aq6F7cWI/H6j4tbeza8tAN19dcwenDro5EfCDY8ARQHJu1f6Y3+DLf2imjkd6Aiu JVAoGIjHIpI+djwCZC1u4gi4urjfOqYartrM3Q54tb3YWYqHeNqP2ASI2a4EpYk= =Ixwt -----END PGP SIGNATURE----- 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 ...
This commit is contained in:
commit
eeee78cf77
52 changed files with 1959 additions and 909 deletions
|
@ -22,7 +22,25 @@
|
|||
* protection, just like TRACE_INCLUDE_FILE.
|
||||
*/
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM sample
|
||||
#define TRACE_SYSTEM sample-trace
|
||||
|
||||
/*
|
||||
* TRACE_SYSTEM is expected to be a C valid variable (alpha-numeric
|
||||
* and underscore), although it may start with numbers. If for some
|
||||
* reason it is not, you need to add the following lines:
|
||||
*/
|
||||
#undef TRACE_SYSTEM_VAR
|
||||
#define TRACE_SYSTEM_VAR sample_trace
|
||||
/*
|
||||
* But the above is only needed if TRACE_SYSTEM is not alpha-numeric
|
||||
* and underscored. By default, TRACE_SYSTEM_VAR will be equal to
|
||||
* TRACE_SYSTEM. As TRACE_SYSTEM_VAR must be alpha-numeric, if
|
||||
* TRACE_SYSTEM is not, then TRACE_SYSTEM_VAR must be defined with
|
||||
* only alpha-numeric and underscores.
|
||||
*
|
||||
* The TRACE_SYSTEM_VAR is only used internally and not visible to
|
||||
* user space.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Notice that this file is not protected like a normal header.
|
||||
|
@ -180,8 +198,30 @@ static inline int __length_of(const int *list)
|
|||
;
|
||||
return i;
|
||||
}
|
||||
|
||||
enum {
|
||||
TRACE_SAMPLE_FOO = 2,
|
||||
TRACE_SAMPLE_BAR = 4,
|
||||
TRACE_SAMPLE_ZOO = 8,
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If enums are used in the TP_printk(), their names will be shown in
|
||||
* format files and not their values. This can cause problems with user
|
||||
* space programs that parse the format files to know how to translate
|
||||
* the raw binary trace output into human readable text.
|
||||
*
|
||||
* To help out user space programs, any enum that is used in the TP_printk()
|
||||
* should be defined by TRACE_DEFINE_ENUM() macro. All that is needed to
|
||||
* be done is to add this macro with the enum within it in the trace
|
||||
* header file, and it will be converted in the output.
|
||||
*/
|
||||
|
||||
TRACE_DEFINE_ENUM(TRACE_SAMPLE_FOO);
|
||||
TRACE_DEFINE_ENUM(TRACE_SAMPLE_BAR);
|
||||
TRACE_DEFINE_ENUM(TRACE_SAMPLE_ZOO);
|
||||
|
||||
TRACE_EVENT(foo_bar,
|
||||
|
||||
TP_PROTO(const char *foo, int bar, const int *lst,
|
||||
|
@ -206,7 +246,47 @@ TRACE_EVENT(foo_bar,
|
|||
__assign_bitmask(cpus, cpumask_bits(mask), num_possible_cpus());
|
||||
),
|
||||
|
||||
TP_printk("foo %s %d %s %s (%s)", __entry->foo, __entry->bar,
|
||||
TP_printk("foo %s %d %s %s %s %s (%s)", __entry->foo, __entry->bar,
|
||||
|
||||
/*
|
||||
* Notice here the use of some helper functions. This includes:
|
||||
*
|
||||
* __print_symbolic( variable, { value, "string" }, ... ),
|
||||
*
|
||||
* The variable is tested against each value of the { } pair. If
|
||||
* the variable matches one of the values, then it will print the
|
||||
* string in that pair. If non are matched, it returns a string
|
||||
* version of the number (if __entry->bar == 7 then "7" is returned).
|
||||
*/
|
||||
__print_symbolic(__entry->bar,
|
||||
{ 0, "zero" },
|
||||
{ TRACE_SAMPLE_FOO, "TWO" },
|
||||
{ TRACE_SAMPLE_BAR, "FOUR" },
|
||||
{ TRACE_SAMPLE_ZOO, "EIGHT" },
|
||||
{ 10, "TEN" }
|
||||
),
|
||||
|
||||
/*
|
||||
* __print_flags( variable, "delim", { value, "flag" }, ... ),
|
||||
*
|
||||
* This is similar to __print_symbolic, except that it tests the bits
|
||||
* of the value. If ((FLAG & variable) == FLAG) then the string is
|
||||
* printed. If more than one flag matches, then each one that does is
|
||||
* also printed with delim in between them.
|
||||
* If not all bits are accounted for, then the not found bits will be
|
||||
* added in hex format: 0x506 will show BIT2|BIT4|0x500
|
||||
*/
|
||||
__print_flags(__entry->bar, "|",
|
||||
{ 1, "BIT1" },
|
||||
{ 2, "BIT2" },
|
||||
{ 4, "BIT3" },
|
||||
{ 8, "BIT4" }
|
||||
),
|
||||
/*
|
||||
* __print_array( array, len, element_size )
|
||||
*
|
||||
* This prints out the array that is defined by __array in a nice format.
|
||||
*/
|
||||
__print_array(__get_dynamic_array(list),
|
||||
__get_dynamic_array_len(list),
|
||||
sizeof(int)),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue