2015-04-03 01:44:40

by Steven Rostedt

[permalink] [raw]
Subject: [PATCH 00/18 v3] tracing: Use TRACE_DEFINE_ENUM() to show enum values

As there are many tracepoints that use __print_symbolic() to translate
numbers into ASCII strings, and several of these translate enums as
well, it causes a problem for user space tools that read the tracepoint
format files and have to translate the binary data to their associated
strings.

For example, with the tlb_flush tracepoint, we have this in the format
file:

print fmt: "pages:%ld reason:%s (%d)", REC->pages,
__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" }), REC->reason

Now, userspace does not know what the value of TLB_REMOTE_SHOOTDOWN is.
To solve this, a new macro is created as a helper to allow tracepoints
to export enums they use to userspace. This macro is called,
TRACE_DEFINE_ENUM(), such that

TRACE_DEFINE_ENUM(TLB_REMOTE_SHOOTDOWN);

will convert the "print fmt"s in the format files to its actual value
and no longer display the enum name.

On boot up (or module load), the enums saved via TRACE_DEFINE_ENUM()
will be searched for in the TP_printk()s of the tracepoints. Logic
knows enough to ignore quoted text.

And the output of the tlb_flush format is now:

print fmt: "pages:%ld reason:%s (%d)", REC->pages,
__print_symbolic(REC->reason,
{ 0, "flush on task switch" },
{ 1, "remote shootdown" },
{ 2, "local shootdown" },
{ 3, "local mm shootdown" }), REC->reason

And userspace tools can easily parse that without special handling.

For debugging, if CONFIG_TRACE_ENUM_MAP_FILE is enabled, a file is added
in the tracing directory to show what enums were added, their values and
the TRACE_SYSTEM that added them:

# cat /sys/kernel/debug/tracing/enum_map
TLB_LOCAL_MM_SHOOTDOWN 3 (tlb)
TLB_LOCAL_SHOOTDOWN 2 (tlb)
TLB_REMOTE_SHOOTDOWN 1 (tlb)
TLB_FLUSH_ON_TASK_SWITCH 0 (tlb)

-- Steve

Local SHA1: 6689c330e3a60defc4c89da17cf5d561649bc55b


Steven Rostedt (1):
tracing/drm: Remove unused TRACE_SYSTEM_STRING define

Steven Rostedt (Red Hat) (17):
tracing: Add TRACE_SYSTEM_VAR to intel-sst
tracing: Add TRACE_SYSTEM_VAR to kvm-s390
tracing: Add TRACE_SYSTEM_VAR to xhci-hcd
tracing: Give system name a pointer
tracing: Update trace-event-sample with TRACE_SYSTEM_VAR documentation
tracing: Add TRACE_DEFINE_ENUM() macro to map enums to their values
tracing: Allow for modules to convert their enums to values
tracing/samples: Update the trace-event-sample.h with TRACE_DEFINE_ENUM()
x86/tlb/trace: Export enums in used by tlb_flush tracepoint
net/9p/tracing: Export enums in tracepoints to userspace
f2fs: Export the enums in the tracepoints to userspace
irq/tracing: Export enums in tracepoints to user space
mm: tracing: Export enums in tracepoints to user space
SUNRPC: Export enums in tracepoints to user space
v4l: Export enums used by tracepoints to user space
writeback: Export enums used by tracepoint to user space
tracing: Add enum_map file to show enums that have been mapped

----
arch/s390/kvm/trace-s390.h | 7 +
drivers/gpu/drm/drm_trace.h | 1 -
drivers/gpu/drm/i915/i915_trace.h | 1 -
drivers/gpu/drm/radeon/radeon_trace.h | 1 -
drivers/usb/host/xhci-trace.h | 7 +
include/asm-generic/vmlinux.lds.h | 5 +-
include/linux/ftrace_event.h | 4 +-
include/linux/module.h | 2 +
include/linux/tracepoint.h | 8 +
include/trace/events/9p.h | 157 ++++++++-------
include/trace/events/f2fs.h | 30 +++
include/trace/events/intel-sst.h | 7 +
include/trace/events/irq.h | 39 ++--
include/trace/events/migrate.h | 42 +++-
include/trace/events/sunrpc.h | 62 ++++--
include/trace/events/tlb.h | 30 ++-
include/trace/events/v4l2.h | 75 ++++---
include/trace/events/writeback.h | 33 +++-
include/trace/ftrace.h | 41 +++-
kernel/module.c | 3 +
kernel/trace/Kconfig | 28 +++
kernel/trace/trace.c | 304 ++++++++++++++++++++++++++++-
kernel/trace/trace.h | 2 +
kernel/trace/trace_events.c | 121 +++++++++++-
samples/trace_events/trace-events-sample.h | 84 +++++++-
25 files changed, 932 insertions(+), 162 deletions(-)


Subject: Re: [PATCH 00/18 v3] tracing: Use TRACE_DEFINE_ENUM() to show enum values

(2015/04/03 10:38), Steven Rostedt wrote:
> As there are many tracepoints that use __print_symbolic() to translate
> numbers into ASCII strings, and several of these translate enums as
> well, it causes a problem for user space tools that read the tracepoint
> format files and have to translate the binary data to their associated
> strings.
>
> For example, with the tlb_flush tracepoint, we have this in the format
> file:
>
> print fmt: "pages:%ld reason:%s (%d)", REC->pages,
> __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" }), REC->reason
>
> Now, userspace does not know what the value of TLB_REMOTE_SHOOTDOWN is.
> To solve this, a new macro is created as a helper to allow tracepoints
> to export enums they use to userspace. This macro is called,
> TRACE_DEFINE_ENUM(), such that
>
> TRACE_DEFINE_ENUM(TLB_REMOTE_SHOOTDOWN);
>
> will convert the "print fmt"s in the format files to its actual value
> and no longer display the enum name.
>
> On boot up (or module load), the enums saved via TRACE_DEFINE_ENUM()
> will be searched for in the TP_printk()s of the tracepoints. Logic
> knows enough to ignore quoted text.
>
> And the output of the tlb_flush format is now:
>
> print fmt: "pages:%ld reason:%s (%d)", REC->pages,
> __print_symbolic(REC->reason,
> { 0, "flush on task switch" },
> { 1, "remote shootdown" },
> { 2, "local shootdown" },
> { 3, "local mm shootdown" }), REC->reason
>
> And userspace tools can easily parse that without special handling.
>
> For debugging, if CONFIG_TRACE_ENUM_MAP_FILE is enabled, a file is added
> in the tracing directory to show what enums were added, their values and
> the TRACE_SYSTEM that added them:
>
> # cat /sys/kernel/debug/tracing/enum_map
> TLB_LOCAL_MM_SHOOTDOWN 3 (tlb)
> TLB_LOCAL_SHOOTDOWN 2 (tlb)
> TLB_REMOTE_SHOOTDOWN 1 (tlb)
> TLB_FLUSH_ON_TASK_SWITCH 0 (tlb)

I've reviewed all patches in this series and tested it.

Reviewed-by: Masami Hiramatsu <[email protected]>
Tested-by: Masami Hiramatsu <[email protected]>

for all the patches in this series.

However, I've also found that the __print_symbolic()s in

events/scsi/scsi_dispatch_cmd_*/format
events/xfs/xfs_map_blocks_alloc/format
events/xfs/xfs_get_blocks_found/format
events/xfs/xfs_get_blocks_alloc/format
events/power/pm_qos_*/format

are not fixed yet.

Thank you,

>
> -- Steve
>
> Local SHA1: 6689c330e3a60defc4c89da17cf5d561649bc55b
>
>
> Steven Rostedt (1):
> tracing/drm: Remove unused TRACE_SYSTEM_STRING define
>
> Steven Rostedt (Red Hat) (17):
> tracing: Add TRACE_SYSTEM_VAR to intel-sst
> tracing: Add TRACE_SYSTEM_VAR to kvm-s390
> tracing: Add TRACE_SYSTEM_VAR to xhci-hcd
> tracing: Give system name a pointer
> tracing: Update trace-event-sample with TRACE_SYSTEM_VAR documentation
> tracing: Add TRACE_DEFINE_ENUM() macro to map enums to their values
> tracing: Allow for modules to convert their enums to values
> tracing/samples: Update the trace-event-sample.h with TRACE_DEFINE_ENUM()
> x86/tlb/trace: Export enums in used by tlb_flush tracepoint
> net/9p/tracing: Export enums in tracepoints to userspace
> f2fs: Export the enums in the tracepoints to userspace
> irq/tracing: Export enums in tracepoints to user space
> mm: tracing: Export enums in tracepoints to user space
> SUNRPC: Export enums in tracepoints to user space
> v4l: Export enums used by tracepoints to user space
> writeback: Export enums used by tracepoint to user space
> tracing: Add enum_map file to show enums that have been mapped
>
> ----
> arch/s390/kvm/trace-s390.h | 7 +
> drivers/gpu/drm/drm_trace.h | 1 -
> drivers/gpu/drm/i915/i915_trace.h | 1 -
> drivers/gpu/drm/radeon/radeon_trace.h | 1 -
> drivers/usb/host/xhci-trace.h | 7 +
> include/asm-generic/vmlinux.lds.h | 5 +-
> include/linux/ftrace_event.h | 4 +-
> include/linux/module.h | 2 +
> include/linux/tracepoint.h | 8 +
> include/trace/events/9p.h | 157 ++++++++-------
> include/trace/events/f2fs.h | 30 +++
> include/trace/events/intel-sst.h | 7 +
> include/trace/events/irq.h | 39 ++--
> include/trace/events/migrate.h | 42 +++-
> include/trace/events/sunrpc.h | 62 ++++--
> include/trace/events/tlb.h | 30 ++-
> include/trace/events/v4l2.h | 75 ++++---
> include/trace/events/writeback.h | 33 +++-
> include/trace/ftrace.h | 41 +++-
> kernel/module.c | 3 +
> kernel/trace/Kconfig | 28 +++
> kernel/trace/trace.c | 304 ++++++++++++++++++++++++++++-
> kernel/trace/trace.h | 2 +
> kernel/trace/trace_events.c | 121 +++++++++++-
> samples/trace_events/trace-events-sample.h | 84 +++++++-
> 25 files changed, 932 insertions(+), 162 deletions(-)
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
>


--
Masami HIRAMATSU
Linux Technology Research Center, System Productivity Research Dept.
Center for Technology Innovation - Systems Engineering
Hitachi, Ltd., Research & Development Group
E-mail: [email protected]

2015-04-07 12:54:32

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH 00/18 v3] tracing: Use TRACE_DEFINE_ENUM() to show enum values

On Tue, 07 Apr 2015 20:26:29 +0900
Masami Hiramatsu <[email protected]> wrote:

> I've reviewed all patches in this series and tested it.
>
> Reviewed-by: Masami Hiramatsu <[email protected]>
> Tested-by: Masami Hiramatsu <[email protected]>
>
> for all the patches in this series.

Thanks for spending the time on this. I'll be hopefully posting this to
linux-next when it finally passes all my tests (I've been finding use
cases that need to be fixed for this to work). The code itself is still
sound.

>
> However, I've also found that the __print_symbolic()s in
>
> events/scsi/scsi_dispatch_cmd_*/format
> events/xfs/xfs_map_blocks_alloc/format
> events/xfs/xfs_get_blocks_found/format
> events/xfs/xfs_get_blocks_alloc/format
> events/power/pm_qos_*/format

Ah, missed some of those, as scsi and xfs use mostly defines, not enums.
I need to boot a config that has all tracepoints enabled and check them
out.

Thanks,

-- Steve

>
> are not fixed yet.
>
> Thank you,
>
> >
> > -- Steve