Re: [PATCH 7/7] function-graph: show binary events as comments

From: Frederic Weisbecker
Date: Thu Mar 19 2009 - 16:52:37 EST


On Thu, Mar 19, 2009 at 04:01:29PM -0400, Steven Rostedt wrote:
> From: Steven Rostedt <srostedt@xxxxxxxxxx>
>
> With the added TRACE_EVENT macro, the events no longer appear in
> the function graph tracer. This was because the function graph
> did not know how to display the entries. The graph tracer was
> only aware of its own entries and the printk entries.
>
> By using the event call back feature, the graph tracer can now display
> the events.
>
> # echo irq > /debug/tracing/set_event
>
> Which can show:
>
> 0) | handle_IRQ_event() {
> 0) | /* irq_handler_entry: irq=48 handler=eth0 */
> 0) | e1000_intr() {
> 0) 0.926 us | __napi_schedule();
> 0) 3.888 us | }
> 0) | /* irq_handler_exit: irq=48 return=handled */
> 0) 0.655 us | runqueue_is_locked();
> 0) | __wake_up() {
> 0) 0.831 us | _spin_lock_irqsave();
>
> The irq entry and exit events show up as comments.
>
> Signed-off-by: Steven Rostedt <srostedt@xxxxxxxxxx>


Thanks a lot for this whole patchset :-)

Frederic.


> ---
> kernel/trace/trace_functions_graph.c | 40 +++++++++++++++++++++++----------
> 1 files changed, 28 insertions(+), 12 deletions(-)
>
> diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
> index 66ea23b..e876816 100644
> --- a/kernel/trace/trace_functions_graph.c
> +++ b/kernel/trace/trace_functions_graph.c
> @@ -712,10 +712,12 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s,
> }
>
> static enum print_line_t
> -print_graph_comment(struct bprint_entry *trace, struct trace_seq *s,
> - struct trace_entry *ent, struct trace_iterator *iter)
> +print_graph_comment(struct trace_seq *s, struct trace_entry *ent,
> + struct trace_iterator *iter)
> {
> + unsigned long sym_flags = (trace_flags & TRACE_ITER_SYM_MASK);
> struct fgraph_data *data = iter->private;
> + struct trace_event *event;
> int depth = 0;
> int ret;
> int i;
> @@ -751,9 +753,26 @@ print_graph_comment(struct bprint_entry *trace, struct trace_seq *s,
> if (!ret)
> return TRACE_TYPE_PARTIAL_LINE;
>
> - ret = trace_seq_bprintf(s, trace->fmt, trace->buf);
> - if (!ret)
> - return TRACE_TYPE_PARTIAL_LINE;
> + switch (iter->ent->type) {
> + case TRACE_BPRINT:
> + ret = trace_print_bprintk_msg_only(iter);
> + if (ret != TRACE_TYPE_HANDLED)
> + return ret;
> + break;
> + case TRACE_PRINT:
> + ret = trace_print_printk_msg_only(iter);
> + if (ret != TRACE_TYPE_HANDLED)
> + return ret;
> + break;
> + default:
> + event = ftrace_find_event(ent->type);
> + if (!event)
> + return TRACE_TYPE_UNHANDLED;
> +
> + ret = event->trace(iter, sym_flags);
> + if (ret != TRACE_TYPE_HANDLED)
> + return ret;
> + }
>
> /* Strip ending newline */
> if (s->buffer[s->len - 1] == '\n') {
> @@ -772,8 +791,8 @@ print_graph_comment(struct bprint_entry *trace, struct trace_seq *s,
> enum print_line_t
> print_graph_function(struct trace_iterator *iter)
> {
> - struct trace_seq *s = &iter->seq;
> struct trace_entry *entry = iter->ent;
> + struct trace_seq *s = &iter->seq;
>
> switch (entry->type) {
> case TRACE_GRAPH_ENT: {
> @@ -786,14 +805,11 @@ print_graph_function(struct trace_iterator *iter)
> trace_assign_type(field, entry);
> return print_graph_return(&field->ret, s, entry, iter);
> }
> - case TRACE_BPRINT: {
> - struct bprint_entry *field;
> - trace_assign_type(field, entry);
> - return print_graph_comment(field, s, entry, iter);
> - }
> default:
> - return TRACE_TYPE_UNHANDLED;
> + return print_graph_comment(s, entry, iter);
> }
> +
> + return TRACE_TYPE_HANDLED;
> }
>
> static void print_graph_headers(struct seq_file *s)
> --
> 1.6.2
>
> --

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/