Merge tag 'trace-v4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 14 Apr 2015 17:49:03 +0000 (10:49 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 14 Apr 2015 17:49:03 +0000 (10:49 -0700)
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
  ...

1  2 
include/linux/module.h
kernel/module.c
kernel/trace/ftrace.c
kernel/trace/trace.c
kernel/trace/trace.h
kernel/trace/trace_events.c
kernel/trace/trace_kprobe.c
kernel/trace/trace_probe.h

Simple merge
diff --cc kernel/module.c
Simple merge
Simple merge
index bcfa2add6dda9ef171cda714f444917c2e8a4f03,39e69568302e0d8095412e78f50f5346fca67dd3..91eecaaa43e0aeaceea2c513a4decc02cf3e981d
@@@ -6524,10 -6751,92 +6736,92 @@@ struct dentry *tracing_init_dentry(void
                return ERR_PTR(-ENOMEM);
        }
  
 -      return tr->dir;
 +      return NULL;
  }
  
 -static __init int tracer_init_debugfs(void)
+ extern struct trace_enum_map *__start_ftrace_enum_maps[];
+ extern struct trace_enum_map *__stop_ftrace_enum_maps[];
+ static void __init trace_enum_init(void)
+ {
+       int len;
+       len = __stop_ftrace_enum_maps - __start_ftrace_enum_maps;
+       trace_insert_enum_map(NULL, __start_ftrace_enum_maps, len);
+ }
+ #ifdef CONFIG_MODULES
+ static void trace_module_add_enums(struct module *mod)
+ {
+       if (!mod->num_trace_enums)
+               return;
+       /*
+        * Modules with bad taint do not have events created, do
+        * not bother with enums either.
+        */
+       if (trace_module_has_bad_taint(mod))
+               return;
+       trace_insert_enum_map(mod, mod->trace_enums, mod->num_trace_enums);
+ }
+ #ifdef CONFIG_TRACE_ENUM_MAP_FILE
+ static void trace_module_remove_enums(struct module *mod)
+ {
+       union trace_enum_map_item *map;
+       union trace_enum_map_item **last = &trace_enum_maps;
+       if (!mod->num_trace_enums)
+               return;
+       mutex_lock(&trace_enum_mutex);
+       map = trace_enum_maps;
+       while (map) {
+               if (map->head.mod == mod)
+                       break;
+               map = trace_enum_jmp_to_tail(map);
+               last = &map->tail.next;
+               map = map->tail.next;
+       }
+       if (!map)
+               goto out;
+       *last = trace_enum_jmp_to_tail(map)->tail.next;
+       kfree(map);
+  out:
+       mutex_unlock(&trace_enum_mutex);
+ }
+ #else
+ static inline void trace_module_remove_enums(struct module *mod) { }
+ #endif /* CONFIG_TRACE_ENUM_MAP_FILE */
+ static int trace_module_notify(struct notifier_block *self,
+                              unsigned long val, void *data)
+ {
+       struct module *mod = data;
+       switch (val) {
+       case MODULE_STATE_COMING:
+               trace_module_add_enums(mod);
+               break;
+       case MODULE_STATE_GOING:
+               trace_module_remove_enums(mod);
+               break;
+       }
+       return 0;
+ }
+ static struct notifier_block trace_module_nb = {
+       .notifier_call = trace_module_notify,
+       .priority = 0,
+ };
+ #endif /* CONFIG_MODULES */
 +static __init int tracer_init_tracefs(void)
  {
        struct dentry *d_tracer;
  
Simple merge
Simple merge
Simple merge
Simple merge