diff options
Diffstat (limited to 'kernel/trace/trace_functions_graph.c')
| -rw-r--r-- | kernel/trace/trace_functions_graph.c | 66 | 
1 files changed, 57 insertions, 9 deletions
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index b3749a2c313..45e6c01b2e4 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c @@ -124,7 +124,7 @@ ftrace_pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret,  	if (unlikely(current->ret_stack[index].fp != frame_pointer)) {  		ftrace_graph_stop();  		WARN(1, "Bad frame pointer: expected %lx, received %lx\n" -		     "  from func %pF return to %lx\n", +		     "  from func %ps return to %lx\n",  		     current->ret_stack[index].fp,  		     frame_pointer,  		     (void *)current->ret_stack[index].func, @@ -364,6 +364,15 @@ print_graph_proc(struct trace_seq *s, pid_t pid)  } +static enum print_line_t +print_graph_lat_fmt(struct trace_seq *s, struct trace_entry *entry) +{ +	if (!trace_seq_putc(s, ' ')) +		return 0; + +	return trace_print_lat_fmt(s, entry); +} +  /* If the pid changed since the last trace, output this event */  static enum print_line_t  verif_pid(struct trace_seq *s, pid_t pid, int cpu, struct fgraph_data *data) @@ -521,6 +530,7 @@ print_graph_irq(struct trace_iterator *iter, unsigned long addr,  		if (ret == TRACE_TYPE_PARTIAL_LINE)  			return TRACE_TYPE_PARTIAL_LINE;  	} +  	/* Proc */  	if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) {  		ret = print_graph_proc(s, pid); @@ -659,7 +669,7 @@ print_graph_entry_leaf(struct trace_iterator *iter,  			return TRACE_TYPE_PARTIAL_LINE;  	} -	ret = trace_seq_printf(s, "%pf();\n", (void *)call->func); +	ret = trace_seq_printf(s, "%ps();\n", (void *)call->func);  	if (!ret)  		return TRACE_TYPE_PARTIAL_LINE; @@ -702,7 +712,7 @@ print_graph_entry_nested(struct trace_iterator *iter,  			return TRACE_TYPE_PARTIAL_LINE;  	} -	ret = trace_seq_printf(s, "%pf() {\n", (void *)call->func); +	ret = trace_seq_printf(s, "%ps() {\n", (void *)call->func);  	if (!ret)  		return TRACE_TYPE_PARTIAL_LINE; @@ -758,6 +768,13 @@ print_graph_prologue(struct trace_iterator *iter, struct trace_seq *s,  			return TRACE_TYPE_PARTIAL_LINE;  	} +	/* Latency format */ +	if (trace_flags & TRACE_ITER_LATENCY_FMT) { +		ret = print_graph_lat_fmt(s, ent); +		if (ret == TRACE_TYPE_PARTIAL_LINE) +			return TRACE_TYPE_PARTIAL_LINE; +	} +  	return 0;  } @@ -952,28 +969,59 @@ print_graph_function(struct trace_iterator *iter)  	return TRACE_TYPE_HANDLED;  } +static void print_lat_header(struct seq_file *s) +{ +	static const char spaces[] = "                "	/* 16 spaces */ +		"    "					/* 4 spaces */ +		"                 ";			/* 17 spaces */ +	int size = 0; + +	if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME) +		size += 16; +	if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) +		size += 4; +	if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) +		size += 17; + +	seq_printf(s, "#%.*s  _-----=> irqs-off        \n", size, spaces); +	seq_printf(s, "#%.*s / _----=> need-resched    \n", size, spaces); +	seq_printf(s, "#%.*s| / _---=> hardirq/softirq \n", size, spaces); +	seq_printf(s, "#%.*s|| / _--=> preempt-depth   \n", size, spaces); +	seq_printf(s, "#%.*s||| / _-=> lock-depth      \n", size, spaces); +	seq_printf(s, "#%.*s|||| /                     \n", size, spaces); +} +  static void print_graph_headers(struct seq_file *s)  { +	int lat = trace_flags & TRACE_ITER_LATENCY_FMT; + +	if (lat) +		print_lat_header(s); +  	/* 1st line */ -	seq_printf(s, "# "); +	seq_printf(s, "#");  	if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME)  		seq_printf(s, "     TIME       ");  	if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) -		seq_printf(s, "CPU"); +		seq_printf(s, " CPU");  	if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) -		seq_printf(s, "  TASK/PID      "); +		seq_printf(s, "  TASK/PID       "); +	if (lat) +		seq_printf(s, "|||||");  	if (tracer_flags.val & TRACE_GRAPH_PRINT_DURATION)  		seq_printf(s, "  DURATION   ");  	seq_printf(s, "               FUNCTION CALLS\n");  	/* 2nd line */ -	seq_printf(s, "# "); +	seq_printf(s, "#");  	if (tracer_flags.val & TRACE_GRAPH_PRINT_ABS_TIME)  		seq_printf(s, "      |         ");  	if (tracer_flags.val & TRACE_GRAPH_PRINT_CPU) -		seq_printf(s, "|  "); +		seq_printf(s, " |  ");  	if (tracer_flags.val & TRACE_GRAPH_PRINT_PROC) -		seq_printf(s, "  |    |        "); +		seq_printf(s, "   |    |        "); +	if (lat) +		seq_printf(s, "|||||");  	if (tracer_flags.val & TRACE_GRAPH_PRINT_DURATION)  		seq_printf(s, "   |   |      ");  	seq_printf(s, "               |   |   |   |\n");  | 
