linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC][PATCH 2/2] tracing/function-graph-tracer: provide documentation for the function graph tracer
@ 2009-02-18  5:35 Frederic Weisbecker
  2009-02-18 14:01 ` Ingo Molnar
  2009-02-18 17:30 ` Steven Rostedt
  0 siblings, 2 replies; 7+ messages in thread
From: Frederic Weisbecker @ 2009-02-18  5:35 UTC (permalink / raw)
  To: Ingo Molnar, Steven Rostedt; +Cc: Arnaldo Carvalho de Melo, linux-kernel

This patch provides the documentation to use the function graph tracer on the ftrace.txt
file.

I know how evil is my english, so don't hesitate to throw some tomatoes and I will fix
the wicked sentences :-)

Note: I guess it could also find its way on 2.6.29, except that it describes the absolute timestamp
field which is not present in the 2.6.29 version. May be I should split it up in two parts?

There are also some pending things such as explanations for set_ftrace_pid, hardirq signals and
context switches.

I would also like to put a link to http://people.redhat.com/mingo/tip.git/tracing-quickstart.txt
from which I picked some ideas and which provides a more quick start and a more practical use of this tracer,
but I don't know if you would accept an external url.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
 Documentation/ftrace.txt |  226 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 226 insertions(+), 0 deletions(-)

diff --git a/Documentation/ftrace.txt b/Documentation/ftrace.txt
index 758fb42..055bcd2 100644
--- a/Documentation/ftrace.txt
+++ b/Documentation/ftrace.txt
@@ -129,6 +129,10 @@ of ftrace. Here is a list of some of the key files:
 
   set_ftrace_pid: Have the function tracer only trace a single thread.
 
+  set_graph_function: Select the function where the trace have to start
+		with the function graph tracer (See the section
+		"dynamic ftrace" for more details).
+
   available_filter_functions: This lists the functions that ftrace
 		has processed and can trace. These are the function
 		names that you can pass to "set_ftrace_filter" or
@@ -143,6 +147,12 @@ Here is the list of current tracers that may be configured.
 
   function - function tracer that uses mcount to trace all functions.
 
+  function_graph_tracer - similar to the function tracer except that the
+		function tracer probes the functions on their entry whereas the
+		function graph tracer traces on both entry and exit of the
+		functions. It then provides the ability to draw a graph of
+		function calls like a primitive C code source.
+
   sched_switch - traces the context switches between tasks.
 
   irqsoff - traces the areas that disable interrupts and saves
@@ -1226,6 +1236,163 @@ kernel module:
 [...]
 
 
+function graph tracer
+---------------------------
+
+This tracer is similar to the function tracer except that it probes
+a function on its entry and its exit.
+This is done by setting a dynamically allocated stack of return addresses on each
+task_struct. Then the tracer overwrites the return address of each function traced
+to set a custom probe. Thus the original return address is stored on the stack of return
+address in the task_struct.
+
+Probing on both extremities of a function leads to special features such as
+
+_ measure of function's time execution
+_ having a reliable call stack to draw function calls graph
+
+This tracer is useful in several situations:
+
+_ you want to find the reason of a strange kernel behavior and need to see
+  what happens in detail on any areas (or specific ones).
+_ you are experiencing weird latencies but it's difficult to find its origin.
+_ you want to find quickly which path is taken by a specific function
+_ you just want to see what happens inside your kernel
+
+# tracer: function_graph
+#
+# CPU  DURATION                  FUNCTION CALLS
+# |     |   |                     |   |   |   |
+
+ 0)               |  sys_open() {
+ 0)               |    do_sys_open() {
+ 0)               |      getname() {
+ 0)               |        kmem_cache_alloc() {
+ 0)   1.382 us    |          __might_sleep();
+ 0)   2.478 us    |        }
+ 0)               |        strncpy_from_user() {
+ 0)               |          might_fault() {
+ 0)   1.389 us    |            __might_sleep();
+ 0)   2.553 us    |          }
+ 0)   3.807 us    |        }
+ 0)   7.876 us    |      }
+ 0)               |      alloc_fd() {
+ 0)   0.668 us    |        _spin_lock();
+ 0)   0.570 us    |        expand_files();
+ 0)   0.586 us    |        _spin_unlock();
+
+
+There are several columns that can be dynamically enabled/disabled.
+You can use every combination of options you want, depending on your needs.
+
+_ The cpu number on which the function executed is default enabled.
+  It is sometimes better to only trace one cpu (see tracing_cpu_mask file)
+  or you might sometimes see unordered function calls while cpu tracing switch.
+
+	hide: echo nofuncgraph-cpu > /debug/tracing/trace_options
+	show: echo funcgraph-cpu > /debug/tracing/trace_options
+
+_ The duration (function's time of execution) is displayed on the closing bracket
+  line of a function or on the same line than the current function in case of a leaf
+  one. It is default enabled.
+
+	hide: echo nofuncgraph-duration > /debug/tracing/trace_options
+	show: echo funcgraph-duration > /debug/tracing/trace_options
+
+_ The overhead field precedes the duration one in case of reached duration thresholds.
+
+	hide: echo nofuncgraph-overhead > /debug/tracing/trace_options
+	show: echo funcgraph-overhead > /debug/tracing/trace_options
+	depends on: funcgraph-duration
+
+  ie:
+
+  0)               |    up_write() {
+  0)   0.646 us    |      _spin_lock_irqsave();
+  0)   0.684 us    |      _spin_unlock_irqrestore();
+  0)   3.123 us    |    }
+  0)   0.548 us    |    fput();
+  0) + 58.628 us   |  }
+
+  [...]
+
+  0)               |      putname() {
+  0)               |        kmem_cache_free() {
+  0)   0.518 us    |          __phys_addr();
+  0)   1.757 us    |        }
+  0)   2.861 us    |      }
+  0) ! 115.305 us  |    }
+  0) ! 116.402 us  |  }
+
+  + means that the function exceeded 10 usecs.
+  ! means that the function exceeded 100 usecs.
+
+
+_ The task/pid field displays the thread cmdline and pid which executed the function.
+  It is default disabled.
+
+	hide: echo nofuncgraph-proc > /debug/tracing/trace_options
+	show: echo funcgraph-proc > /debug/tracing/trace_options
+
+  ie:
+
+  # tracer: function_graph
+  #
+  # CPU  TASK/PID        DURATION                  FUNCTION CALLS
+  # |    |    |           |   |                     |   |   |   |
+  0)    sh-4802     |               |                  d_free() {
+  0)    sh-4802     |               |                    call_rcu() {
+  0)    sh-4802     |               |                      __call_rcu() {
+  0)    sh-4802     |   0.616 us    |                        rcu_process_gp_end();
+  0)    sh-4802     |   0.586 us    |                        check_for_new_grace_period();
+  0)    sh-4802     |   2.899 us    |                      }
+  0)    sh-4802     |   4.040 us    |                    }
+  0)    sh-4802     |   5.151 us    |                  }
+  0)    sh-4802     | + 49.370 us   |                }
+
+
+_ The absolute time field is an absolute timestamp given by the clock since
+  it started. A snapshot of this time is given on each entry/exit of functions
+
+	hide: echo nofuncgraph-abstime > /debug/tracing/trace_options
+	show: echo funcgraph-abstime > /debug/tracing/trace_options
+
+  ie:
+
+  #
+  #      TIME       CPU  DURATION                  FUNCTION CALLS
+  #       |         |     |   |                     |   |   |   |
+  360.774522 |   1)   0.541 us    |                                          }
+  360.774522 |   1)   4.663 us    |                                        }
+  360.774523 |   1)   0.541 us    |                                        __wake_up_bit();
+  360.774524 |   1)   6.796 us    |                                      }
+  360.774524 |   1)   7.952 us    |                                    }
+  360.774525 |   1)   9.063 us    |                                  }
+  360.774525 |   1)   0.615 us    |                                  journal_mark_dirty();
+  360.774527 |   1)   0.578 us    |                                  __brelse();
+  360.774528 |   1)               |                                  reiserfs_prepare_for_journal() {
+  360.774528 |   1)               |                                    unlock_buffer() {
+  360.774529 |   1)               |                                      wake_up_bit() {
+  360.774529 |   1)               |                                        bit_waitqueue() {
+  360.774530 |   1)   0.594 us    |                                          __phys_addr();
+
+
+You can put some comments on specific functions by using ftrace_printk()
+For example, if you want to put a comment inside the __might_sleep() function,
+you just have to include <linux/ftrace.h> and call ftrace_printk() inside __might_sleep()
+
+ftrace_printk("I'm a comment!\n")
+
+will produce:
+
+ 1)               |             __might_sleep() {
+ 1)               |                /* I'm a comment! */
+ 1)   1.449 us    |             }
+
+
+You might find other useful features for this tracer on the "dynamic ftrace"
+section such as tracing only specific functions or tasks.
+
 dynamic ftrace
 --------------
 
@@ -1427,6 +1594,65 @@ Produces:
 
 We can see that there's no more lock or preempt tracing.
 
+
+* Dynamic ftrace with the function graph tracer *
+
+
+Although what has been explained above concerns both the function tracer and
+the function_graph_tracer, the following concerns only the latter.
+
+If you want to trace only one function and all of its childs, you just have
+to echo its name on set_graph_function:
+
+echo __do_fault > set_graph_function
+
+will produce the following:
+
+ 0)               |  __do_fault() {
+ 0)               |    filemap_fault() {
+ 0)               |      find_lock_page() {
+ 0)   0.804 us    |        find_get_page();
+ 0)               |        __might_sleep() {
+ 0)   1.329 us    |        }
+ 0)   3.904 us    |      }
+ 0)   4.979 us    |    }
+ 0)   0.653 us    |    _spin_lock();
+ 0)   0.578 us    |    page_add_file_rmap();
+ 0)   0.525 us    |    native_set_pte_at();
+ 0)   0.585 us    |    _spin_unlock();
+ 0)               |    unlock_page() {
+ 0)   0.541 us    |      page_waitqueue();
+ 0)   0.639 us    |      __wake_up_bit();
+ 0)   2.786 us    |    }
+ 0) + 14.237 us   |  }
+ 0)               |  __do_fault() {
+ 0)               |    filemap_fault() {
+ 0)               |      find_lock_page() {
+ 0)   0.698 us    |        find_get_page();
+ 0)               |        __might_sleep() {
+ 0)   1.412 us    |        }
+ 0)   3.950 us    |      }
+ 0)   5.098 us    |    }
+ 0)   0.631 us    |    _spin_lock();
+ 0)   0.571 us    |    page_add_file_rmap();
+ 0)   0.526 us    |    native_set_pte_at();
+ 0)   0.586 us    |    _spin_unlock();
+ 0)               |    unlock_page() {
+ 0)   0.533 us    |      page_waitqueue();
+ 0)   0.638 us    |      __wake_up_bit();
+ 0)   2.793 us    |    }
+ 0) + 14.012 us   |  }
+
+You can also select several functions:
+
+echo sys_open > set_graph_function
+echo sys_close >> set_graph_function
+
+Now if you want to go back to trace all functions
+
+echo > set_graph_function
+
+
 trace_pipe
 ----------
 
-- 
1.6.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH 2/2] tracing/function-graph-tracer: provide documentation for the function graph tracer
  2009-02-18  5:35 [RFC][PATCH 2/2] tracing/function-graph-tracer: provide documentation for the function graph tracer Frederic Weisbecker
@ 2009-02-18 14:01 ` Ingo Molnar
  2009-02-18 15:58   ` Frederic Weisbecker
  2009-02-18 17:30 ` Steven Rostedt
  1 sibling, 1 reply; 7+ messages in thread
From: Ingo Molnar @ 2009-02-18 14:01 UTC (permalink / raw)
  To: Frederic Weisbecker
  Cc: Steven Rostedt, Arnaldo Carvalho de Melo, linux-kernel


btw., a minor trace-output observation. We currently have this 
default output:

# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |

 0)               |  sys_open() {
 0)               |    do_sys_open() {
 0)               |      getname() {
 0)               |        kmem_cache_alloc() {
 0)   1.382 us    |          __might_sleep();
 0)   2.478 us    |        }

Wouldnt this tweaked version look even nicer:

#
# [ tracer: function_graph ]
#
 CPU)  <duration>   |  <function-name>
 ..............................................
   0)               |  sys_open() {
   0)               |    do_sys_open() {
   0)               |      getname() {
   0)               |        kmem_cache_alloc() {
   0)   1.382 us    |          __might_sleep();
   0)   2.478 us    |        }


Changes:

 1) Added an empty '#' line to the head. Looks nicer because 
    the comment is now symmetric.

 2) Shifted of the CPU field two positions to the left. Better 
    for paste-ability and makes the 'CPU)' header fit as well.

 3) Changed the field description in the header portion to a 
    standard <field> notation.

 4) added the '....' line to create a table.

Hm?

	Ingo

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH 2/2] tracing/function-graph-tracer: provide documentation for the function graph tracer
  2009-02-18 14:01 ` Ingo Molnar
@ 2009-02-18 15:58   ` Frederic Weisbecker
  2009-02-18 16:10     ` Ingo Molnar
  0 siblings, 1 reply; 7+ messages in thread
From: Frederic Weisbecker @ 2009-02-18 15:58 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Steven Rostedt, Arnaldo Carvalho de Melo, linux-kernel

On Wed, Feb 18, 2009 at 03:01:50PM +0100, Ingo Molnar wrote:
> 
> btw., a minor trace-output observation. We currently have this 
> default output:
> 
> # tracer: function_graph
> #
> # CPU  DURATION                  FUNCTION CALLS
> # |     |   |                     |   |   |   |
> 
>  0)               |  sys_open() {
>  0)               |    do_sys_open() {
>  0)               |      getname() {
>  0)               |        kmem_cache_alloc() {
>  0)   1.382 us    |          __might_sleep();
>  0)   2.478 us    |        }
> 
> Wouldnt this tweaked version look even nicer:
> 
> #
> # [ tracer: function_graph ]
> #
>  CPU)  <duration>   |  <function-name>
>  ..............................................
>    0)               |  sys_open() {
>    0)               |    do_sys_open() {
>    0)               |      getname() {
>    0)               |        kmem_cache_alloc() {
>    0)   1.382 us    |          __might_sleep();
>    0)   2.478 us    |        }
> 
> 
> Changes:
> 
>  1) Added an empty '#' line to the head. Looks nicer because 
>     the comment is now symmetric.

Right.
 
>  2) Shifted of the CPU field two positions to the left. Better 
>     for paste-ability and makes the 'CPU)' header fit as well.


Good.


>  3) Changed the field description in the header portion to a 
>     standard <field> notation.


I guess it's more a matter of taste here.
I like the uppercase titles because they draw a good separation between
titles and traces.


>  4) added the '....' line to create a table.


Yeah, seems better.


> Hm?
> 
> 	Ingo


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH 2/2] tracing/function-graph-tracer: provide documentation for the function graph tracer
  2009-02-18 15:58   ` Frederic Weisbecker
@ 2009-02-18 16:10     ` Ingo Molnar
  2009-02-19  4:09       ` Frederic Weisbecker
  0 siblings, 1 reply; 7+ messages in thread
From: Ingo Molnar @ 2009-02-18 16:10 UTC (permalink / raw)
  To: Frederic Weisbecker
  Cc: Steven Rostedt, Arnaldo Carvalho de Melo, linux-kernel


* Frederic Weisbecker <fweisbec@gmail.com> wrote:

> On Wed, Feb 18, 2009 at 03:01:50PM +0100, Ingo Molnar wrote:
> > 
> > btw., a minor trace-output observation. We currently have this 
> > default output:
> > 
> > # tracer: function_graph
> > #
> > # CPU  DURATION                  FUNCTION CALLS
> > # |     |   |                     |   |   |   |
> > 
> >  0)               |  sys_open() {
> >  0)               |    do_sys_open() {
> >  0)               |      getname() {
> >  0)               |        kmem_cache_alloc() {
> >  0)   1.382 us    |          __might_sleep();
> >  0)   2.478 us    |        }
> > 
> > Wouldnt this tweaked version look even nicer:
> > 
> > #
> > # [ tracer: function_graph ]
> > #
> >  CPU)  <duration>   |  <function-name>
> >  ..............................................
> >    0)               |  sys_open() {
> >    0)               |    do_sys_open() {
> >    0)               |      getname() {
> >    0)               |        kmem_cache_alloc() {
> >    0)   1.382 us    |          __might_sleep();
> >    0)   2.478 us    |        }
> > 
> > 
> > Changes:
> > 
> >  1) Added an empty '#' line to the head. Looks nicer because 
> >     the comment is now symmetric.
> 
> Right.
>  
> >  2) Shifted of the CPU field two positions to the left. Better 
> >     for paste-ability and makes the 'CPU)' header fit as well.
> 
> 
> Good.
> 
> 
> >  3) Changed the field description in the header portion to a 
> >     standard <field> notation.
> 
> 
> I guess it's more a matter of taste here.
> I like the uppercase titles because they draw a good separation between
> titles and traces.

hm, to me they look a bit sloppy. It's hard to align them to the 
colums so they look detached - despite the '| | |' vertical 
lines. Unless you find the <field> notation outright ugly, could 
we try that and see how it goes?

	Ingo

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH 2/2] tracing/function-graph-tracer: provide documentation for the function graph tracer
  2009-02-18  5:35 [RFC][PATCH 2/2] tracing/function-graph-tracer: provide documentation for the function graph tracer Frederic Weisbecker
  2009-02-18 14:01 ` Ingo Molnar
@ 2009-02-18 17:30 ` Steven Rostedt
  2009-02-19 12:25   ` Ingo Molnar
  1 sibling, 1 reply; 7+ messages in thread
From: Steven Rostedt @ 2009-02-18 17:30 UTC (permalink / raw)
  To: Frederic Weisbecker; +Cc: Ingo Molnar, Arnaldo Carvalho de Melo, linux-kernel


Thanks Frederic,

I'll go through it later. I Really need to rewrite ftrace.txt to match 
what is in 29 now. That will soon be a high priority for me.

-- Steve


On Wed, 18 Feb 2009, Frederic Weisbecker wrote:

> This patch provides the documentation to use the function graph tracer on the ftrace.txt
> file.
> 
> I know how evil is my english, so don't hesitate to throw some tomatoes and I will fix
> the wicked sentences :-)
> 
> Note: I guess it could also find its way on 2.6.29, except that it describes the absolute timestamp
> field which is not present in the 2.6.29 version. May be I should split it up in two parts?
> 
> There are also some pending things such as explanations for set_ftrace_pid, hardirq signals and
> context switches.
> 
> I would also like to put a link to http://people.redhat.com/mingo/tip.git/tracing-quickstart.txt
> from which I picked some ideas and which provides a more quick start and a more practical use of this tracer,
> but I don't know if you would accept an external url.
> 
> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
> ---
>  Documentation/ftrace.txt |  226 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 226 insertions(+), 0 deletions(-)
> 
> diff --git a/Documentation/ftrace.txt b/Documentation/ftrace.txt
> index 758fb42..055bcd2 100644
> --- a/Documentation/ftrace.txt
> +++ b/Documentation/ftrace.txt
> @@ -129,6 +129,10 @@ of ftrace. Here is a list of some of the key files:
>  
>    set_ftrace_pid: Have the function tracer only trace a single thread.
>  
> +  set_graph_function: Select the function where the trace have to start
> +		with the function graph tracer (See the section
> +		"dynamic ftrace" for more details).
> +
>    available_filter_functions: This lists the functions that ftrace
>  		has processed and can trace. These are the function
>  		names that you can pass to "set_ftrace_filter" or
> @@ -143,6 +147,12 @@ Here is the list of current tracers that may be configured.
>  
>    function - function tracer that uses mcount to trace all functions.
>  
> +  function_graph_tracer - similar to the function tracer except that the
> +		function tracer probes the functions on their entry whereas the
> +		function graph tracer traces on both entry and exit of the
> +		functions. It then provides the ability to draw a graph of
> +		function calls like a primitive C code source.
> +
>    sched_switch - traces the context switches between tasks.
>  
>    irqsoff - traces the areas that disable interrupts and saves
> @@ -1226,6 +1236,163 @@ kernel module:
>  [...]
>  
>  
> +function graph tracer
> +---------------------------
> +
> +This tracer is similar to the function tracer except that it probes
> +a function on its entry and its exit.
> +This is done by setting a dynamically allocated stack of return addresses on each
> +task_struct. Then the tracer overwrites the return address of each function traced
> +to set a custom probe. Thus the original return address is stored on the stack of return
> +address in the task_struct.
> +
> +Probing on both extremities of a function leads to special features such as
> +
> +_ measure of function's time execution
> +_ having a reliable call stack to draw function calls graph
> +
> +This tracer is useful in several situations:
> +
> +_ you want to find the reason of a strange kernel behavior and need to see
> +  what happens in detail on any areas (or specific ones).
> +_ you are experiencing weird latencies but it's difficult to find its origin.
> +_ you want to find quickly which path is taken by a specific function
> +_ you just want to see what happens inside your kernel
> +
> +# tracer: function_graph
> +#
> +# CPU  DURATION                  FUNCTION CALLS
> +# |     |   |                     |   |   |   |
> +
> + 0)               |  sys_open() {
> + 0)               |    do_sys_open() {
> + 0)               |      getname() {
> + 0)               |        kmem_cache_alloc() {
> + 0)   1.382 us    |          __might_sleep();
> + 0)   2.478 us    |        }
> + 0)               |        strncpy_from_user() {
> + 0)               |          might_fault() {
> + 0)   1.389 us    |            __might_sleep();
> + 0)   2.553 us    |          }
> + 0)   3.807 us    |        }
> + 0)   7.876 us    |      }
> + 0)               |      alloc_fd() {
> + 0)   0.668 us    |        _spin_lock();
> + 0)   0.570 us    |        expand_files();
> + 0)   0.586 us    |        _spin_unlock();
> +
> +
> +There are several columns that can be dynamically enabled/disabled.
> +You can use every combination of options you want, depending on your needs.
> +
> +_ The cpu number on which the function executed is default enabled.
> +  It is sometimes better to only trace one cpu (see tracing_cpu_mask file)
> +  or you might sometimes see unordered function calls while cpu tracing switch.
> +
> +	hide: echo nofuncgraph-cpu > /debug/tracing/trace_options
> +	show: echo funcgraph-cpu > /debug/tracing/trace_options
> +
> +_ The duration (function's time of execution) is displayed on the closing bracket
> +  line of a function or on the same line than the current function in case of a leaf
> +  one. It is default enabled.
> +
> +	hide: echo nofuncgraph-duration > /debug/tracing/trace_options
> +	show: echo funcgraph-duration > /debug/tracing/trace_options
> +
> +_ The overhead field precedes the duration one in case of reached duration thresholds.
> +
> +	hide: echo nofuncgraph-overhead > /debug/tracing/trace_options
> +	show: echo funcgraph-overhead > /debug/tracing/trace_options
> +	depends on: funcgraph-duration
> +
> +  ie:
> +
> +  0)               |    up_write() {
> +  0)   0.646 us    |      _spin_lock_irqsave();
> +  0)   0.684 us    |      _spin_unlock_irqrestore();
> +  0)   3.123 us    |    }
> +  0)   0.548 us    |    fput();
> +  0) + 58.628 us   |  }
> +
> +  [...]
> +
> +  0)               |      putname() {
> +  0)               |        kmem_cache_free() {
> +  0)   0.518 us    |          __phys_addr();
> +  0)   1.757 us    |        }
> +  0)   2.861 us    |      }
> +  0) ! 115.305 us  |    }
> +  0) ! 116.402 us  |  }
> +
> +  + means that the function exceeded 10 usecs.
> +  ! means that the function exceeded 100 usecs.
> +
> +
> +_ The task/pid field displays the thread cmdline and pid which executed the function.
> +  It is default disabled.
> +
> +	hide: echo nofuncgraph-proc > /debug/tracing/trace_options
> +	show: echo funcgraph-proc > /debug/tracing/trace_options
> +
> +  ie:
> +
> +  # tracer: function_graph
> +  #
> +  # CPU  TASK/PID        DURATION                  FUNCTION CALLS
> +  # |    |    |           |   |                     |   |   |   |
> +  0)    sh-4802     |               |                  d_free() {
> +  0)    sh-4802     |               |                    call_rcu() {
> +  0)    sh-4802     |               |                      __call_rcu() {
> +  0)    sh-4802     |   0.616 us    |                        rcu_process_gp_end();
> +  0)    sh-4802     |   0.586 us    |                        check_for_new_grace_period();
> +  0)    sh-4802     |   2.899 us    |                      }
> +  0)    sh-4802     |   4.040 us    |                    }
> +  0)    sh-4802     |   5.151 us    |                  }
> +  0)    sh-4802     | + 49.370 us   |                }
> +
> +
> +_ The absolute time field is an absolute timestamp given by the clock since
> +  it started. A snapshot of this time is given on each entry/exit of functions
> +
> +	hide: echo nofuncgraph-abstime > /debug/tracing/trace_options
> +	show: echo funcgraph-abstime > /debug/tracing/trace_options
> +
> +  ie:
> +
> +  #
> +  #      TIME       CPU  DURATION                  FUNCTION CALLS
> +  #       |         |     |   |                     |   |   |   |
> +  360.774522 |   1)   0.541 us    |                                          }
> +  360.774522 |   1)   4.663 us    |                                        }
> +  360.774523 |   1)   0.541 us    |                                        __wake_up_bit();
> +  360.774524 |   1)   6.796 us    |                                      }
> +  360.774524 |   1)   7.952 us    |                                    }
> +  360.774525 |   1)   9.063 us    |                                  }
> +  360.774525 |   1)   0.615 us    |                                  journal_mark_dirty();
> +  360.774527 |   1)   0.578 us    |                                  __brelse();
> +  360.774528 |   1)               |                                  reiserfs_prepare_for_journal() {
> +  360.774528 |   1)               |                                    unlock_buffer() {
> +  360.774529 |   1)               |                                      wake_up_bit() {
> +  360.774529 |   1)               |                                        bit_waitqueue() {
> +  360.774530 |   1)   0.594 us    |                                          __phys_addr();
> +
> +
> +You can put some comments on specific functions by using ftrace_printk()
> +For example, if you want to put a comment inside the __might_sleep() function,
> +you just have to include <linux/ftrace.h> and call ftrace_printk() inside __might_sleep()
> +
> +ftrace_printk("I'm a comment!\n")
> +
> +will produce:
> +
> + 1)               |             __might_sleep() {
> + 1)               |                /* I'm a comment! */
> + 1)   1.449 us    |             }
> +
> +
> +You might find other useful features for this tracer on the "dynamic ftrace"
> +section such as tracing only specific functions or tasks.
> +
>  dynamic ftrace
>  --------------
>  
> @@ -1427,6 +1594,65 @@ Produces:
>  
>  We can see that there's no more lock or preempt tracing.
>  
> +
> +* Dynamic ftrace with the function graph tracer *
> +
> +
> +Although what has been explained above concerns both the function tracer and
> +the function_graph_tracer, the following concerns only the latter.
> +
> +If you want to trace only one function and all of its childs, you just have
> +to echo its name on set_graph_function:
> +
> +echo __do_fault > set_graph_function
> +
> +will produce the following:
> +
> + 0)               |  __do_fault() {
> + 0)               |    filemap_fault() {
> + 0)               |      find_lock_page() {
> + 0)   0.804 us    |        find_get_page();
> + 0)               |        __might_sleep() {
> + 0)   1.329 us    |        }
> + 0)   3.904 us    |      }
> + 0)   4.979 us    |    }
> + 0)   0.653 us    |    _spin_lock();
> + 0)   0.578 us    |    page_add_file_rmap();
> + 0)   0.525 us    |    native_set_pte_at();
> + 0)   0.585 us    |    _spin_unlock();
> + 0)               |    unlock_page() {
> + 0)   0.541 us    |      page_waitqueue();
> + 0)   0.639 us    |      __wake_up_bit();
> + 0)   2.786 us    |    }
> + 0) + 14.237 us   |  }
> + 0)               |  __do_fault() {
> + 0)               |    filemap_fault() {
> + 0)               |      find_lock_page() {
> + 0)   0.698 us    |        find_get_page();
> + 0)               |        __might_sleep() {
> + 0)   1.412 us    |        }
> + 0)   3.950 us    |      }
> + 0)   5.098 us    |    }
> + 0)   0.631 us    |    _spin_lock();
> + 0)   0.571 us    |    page_add_file_rmap();
> + 0)   0.526 us    |    native_set_pte_at();
> + 0)   0.586 us    |    _spin_unlock();
> + 0)               |    unlock_page() {
> + 0)   0.533 us    |      page_waitqueue();
> + 0)   0.638 us    |      __wake_up_bit();
> + 0)   2.793 us    |    }
> + 0) + 14.012 us   |  }
> +
> +You can also select several functions:
> +
> +echo sys_open > set_graph_function
> +echo sys_close >> set_graph_function
> +
> +Now if you want to go back to trace all functions
> +
> +echo > set_graph_function
> +
> +
>  trace_pipe
>  ----------
>  
> -- 
> 1.6.1
> 
> 
> 
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH 2/2] tracing/function-graph-tracer: provide documentation for the function graph tracer
  2009-02-18 16:10     ` Ingo Molnar
@ 2009-02-19  4:09       ` Frederic Weisbecker
  0 siblings, 0 replies; 7+ messages in thread
From: Frederic Weisbecker @ 2009-02-19  4:09 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Steven Rostedt, Arnaldo Carvalho de Melo, linux-kernel

On Wed, Feb 18, 2009 at 05:10:41PM +0100, Ingo Molnar wrote:
> 
> * Frederic Weisbecker <fweisbec@gmail.com> wrote:
> 
> > On Wed, Feb 18, 2009 at 03:01:50PM +0100, Ingo Molnar wrote:
> > > 
> > > btw., a minor trace-output observation. We currently have this 
> > > default output:
> > > 
> > > # tracer: function_graph
> > > #
> > > # CPU  DURATION                  FUNCTION CALLS
> > > # |     |   |                     |   |   |   |
> > > 
> > >  0)               |  sys_open() {
> > >  0)               |    do_sys_open() {
> > >  0)               |      getname() {
> > >  0)               |        kmem_cache_alloc() {
> > >  0)   1.382 us    |          __might_sleep();
> > >  0)   2.478 us    |        }
> > > 
> > > Wouldnt this tweaked version look even nicer:
> > > 
> > > #
> > > # [ tracer: function_graph ]
> > > #
> > >  CPU)  <duration>   |  <function-name>
> > >  ..............................................
> > >    0)               |  sys_open() {
> > >    0)               |    do_sys_open() {
> > >    0)               |      getname() {
> > >    0)               |        kmem_cache_alloc() {
> > >    0)   1.382 us    |          __might_sleep();
> > >    0)   2.478 us    |        }
> > > 
> > > 
> > > Changes:
> > > 
> > >  1) Added an empty '#' line to the head. Looks nicer because 
> > >     the comment is now symmetric.
> > 
> > Right.
> >  
> > >  2) Shifted of the CPU field two positions to the left. Better 
> > >     for paste-ability and makes the 'CPU)' header fit as well.
> > 
> > 
> > Good.
> > 
> > 
> > >  3) Changed the field description in the header portion to a 
> > >     standard <field> notation.
> > 
> > 
> > I guess it's more a matter of taste here.
> > I like the uppercase titles because they draw a good separation between
> > titles and traces.
> 
> hm, to me they look a bit sloppy. It's hard to align them to the 
> colums so they look detached - despite the '| | |' vertical 
> lines. Unless you find the <field> notation outright ugly, could 
> we try that and see how it goes?
> 
> 	Ingo

Sure! I will send an RFC and wait for opinions...


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH 2/2] tracing/function-graph-tracer: provide documentation for the function graph tracer
  2009-02-18 17:30 ` Steven Rostedt
@ 2009-02-19 12:25   ` Ingo Molnar
  0 siblings, 0 replies; 7+ messages in thread
From: Ingo Molnar @ 2009-02-19 12:25 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Frederic Weisbecker, Arnaldo Carvalho de Melo, linux-kernel


* Steven Rostedt <rostedt@goodmis.org> wrote:

> Thanks Frederic,
> 
> I'll go through it later. I Really need to rewrite ftrace.txt 
> to match what is in 29 now. That will soon be a high priority 
> for me.

Note, i applied Frederic's patch and cleaned up ftrace.txt 
typography a bit. If you update the file then please update it 
to the latest status quo - it's too late for .29 documentation 
updates.

	Ingo

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2009-02-19 12:26 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-18  5:35 [RFC][PATCH 2/2] tracing/function-graph-tracer: provide documentation for the function graph tracer Frederic Weisbecker
2009-02-18 14:01 ` Ingo Molnar
2009-02-18 15:58   ` Frederic Weisbecker
2009-02-18 16:10     ` Ingo Molnar
2009-02-19  4:09       ` Frederic Weisbecker
2009-02-18 17:30 ` Steven Rostedt
2009-02-19 12:25   ` Ingo Molnar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).