tracing: Add funcgraph_tail option to print function name after closing braces
authorRobert Elliott <elliott@hp.com>
Tue, 20 May 2014 22:10:51 +0000 (17:10 -0500)
committerSteven Rostedt <rostedt@goodmis.org>
Wed, 21 May 2014 03:29:32 +0000 (23:29 -0400)
In the function-graph tracer, add a funcgraph_tail option
to print the function name on all } lines, not just
functions whose first line is no longer in the trace
buffer.

If a function calls other traced functions, its total
time appears on its } line.  This change allows grep
to be used to determine the function for which the
line corresponds.

Update Documentation/trace/ftrace.txt to describe
this new option.

Link: http://lkml.kernel.org/p/20140520221041.8359.6782.stgit@beardog.cce.hp.com
Signed-off-by: Robert Elliott <elliott@hp.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Documentation/trace/ftrace.txt
kernel/trace/trace.h
kernel/trace/trace_functions_graph.c

index bd365988e8d8d8b94d10188cd26f0b70e42061c9..2479b2a0c77cdfb63a6c7f117d0ed6b8555eba8d 100644 (file)
@@ -2003,6 +2003,32 @@ want, depending on your needs.
   360.774530 |   1)   0.594 us    |                                          __phys_addr();
 
 
+The function name is always displayed after the closing bracket
+for a function if the start of that function is not in the
+trace buffer.
+
+Display of the function name after the closing bracket may be
+enabled for functions whose start is in the trace buffer,
+allowing easier searching with grep for function durations.
+It is default disabled.
+
+       hide: echo nofuncgraph-tail > trace_options
+       show: echo funcgraph-tail > trace_options
+
+  Example with nofuncgraph-tail (default):
+  0)               |      putname() {
+  0)               |        kmem_cache_free() {
+  0)   0.518 us    |          __phys_addr();
+  0)   1.757 us    |        }
+  0)   2.861 us    |      }
+
+  Example with funcgraph-tail:
+  0)               |      putname() {
+  0)               |        kmem_cache_free() {
+  0)   0.518 us    |          __phys_addr();
+  0)   1.757 us    |        } /* kmem_cache_free() */
+  0)   2.861 us    |      } /* putname() */
+
 You can put some comments on specific functions by using
 trace_printk() For example, if you want to put a comment inside
 the __might_sleep() function, you just have to include
index 68050633255eaecfc5b6aae0148d5dad9bee3f6d..217207ad60b3ec910dc869a2b76d1b0ea1281f4e 100644 (file)
@@ -725,6 +725,7 @@ extern unsigned long trace_flags;
 #define TRACE_GRAPH_PRINT_DURATION      0x10
 #define TRACE_GRAPH_PRINT_ABS_TIME      0x20
 #define TRACE_GRAPH_PRINT_IRQS          0x40
+#define TRACE_GRAPH_PRINT_TAIL          0x80
 #define TRACE_GRAPH_PRINT_FILL_SHIFT   28
 #define TRACE_GRAPH_PRINT_FILL_MASK    (0x3 << TRACE_GRAPH_PRINT_FILL_SHIFT)
 
index af08dd531cb8d8bc2872641d1c101b431e4789ac..4de3e57f723cd5808833d32acbccd3ff6e513921 100644 (file)
@@ -55,11 +55,13 @@ static struct tracer_opt trace_opts[] = {
        { TRACER_OPT(funcgraph-abstime, TRACE_GRAPH_PRINT_ABS_TIME) },
        /* Display interrupts */
        { TRACER_OPT(funcgraph-irqs, TRACE_GRAPH_PRINT_IRQS) },
+       /* Display function name after trailing } */
+       { TRACER_OPT(funcgraph-tail, TRACE_GRAPH_PRINT_TAIL) },
        { } /* Empty entry */
 };
 
 static struct tracer_flags tracer_flags = {
-       /* Don't display overruns and proc by default */
+       /* Don't display overruns, proc, or tail by default */
        .val = TRACE_GRAPH_PRINT_CPU | TRACE_GRAPH_PRINT_OVERHEAD |
               TRACE_GRAPH_PRINT_DURATION | TRACE_GRAPH_PRINT_IRQS,
        .opts = trace_opts
@@ -1167,9 +1169,10 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s,
         * If the return function does not have a matching entry,
         * then the entry was lost. Instead of just printing
         * the '}' and letting the user guess what function this
-        * belongs to, write out the function name.
+        * belongs to, write out the function name. Always do
+        * that if the funcgraph-tail option is enabled.
         */
-       if (func_match) {
+       if (func_match && !(flags & TRACE_GRAPH_PRINT_TAIL)) {
                ret = trace_seq_puts(s, "}\n");
                if (!ret)
                        return TRACE_TYPE_PARTIAL_LINE;