ftrace: Access ret_stack->subtime only in the function profiler

The subtime is used only for function profiler with function graph
tracer enabled.  Move the definition of subtime under
CONFIG_FUNCTION_PROFILER to reduce the memory usage.  Also move the
initialization of subtime into the graph entry callback.

Link: http://lkml.kernel.org/r/20160831025529.24018-1-namhyung@kernel.org

Cc: Ingo Molnar <mingo@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
Namhyung Kim 2016-08-31 11:55:29 +09:00 committed by Steven Rostedt
parent 613dccdf68
commit 8861dd303c
4 changed files with 13 additions and 6 deletions

View file

@ -858,11 +858,11 @@ x494] <- /root/a.out[+0x4a8] <- /lib/libc-2.7.so[+0x1e1a6]
When enabled, it will account time the task has been When enabled, it will account time the task has been
scheduled out as part of the function call. scheduled out as part of the function call.
graph-time - When running function graph tracer, to include the graph-time - When running function profiler with function graph tracer,
time to call nested functions. When this is not set, to include the time to call nested functions. When this is
the time reported for the function will only include not set, the time reported for the function will only
the time the function itself executed for, not the time include the time the function itself executed for, not the
for functions that it called. time for functions that it called.
record-cmd - When any event or tracer is enabled, a hook is enabled record-cmd - When any event or tracer is enabled, a hook is enabled
in the sched_switch trace point to fill comm cache in the sched_switch trace point to fill comm cache

View file

@ -794,7 +794,9 @@ struct ftrace_ret_stack {
unsigned long ret; unsigned long ret;
unsigned long func; unsigned long func;
unsigned long long calltime; unsigned long long calltime;
#ifdef CONFIG_FUNCTION_PROFILER
unsigned long long subtime; unsigned long long subtime;
#endif
unsigned long fp; unsigned long fp;
}; };

View file

@ -872,7 +872,13 @@ function_profile_call(unsigned long ip, unsigned long parent_ip,
#ifdef CONFIG_FUNCTION_GRAPH_TRACER #ifdef CONFIG_FUNCTION_GRAPH_TRACER
static int profile_graph_entry(struct ftrace_graph_ent *trace) static int profile_graph_entry(struct ftrace_graph_ent *trace)
{ {
int index = trace->depth;
function_profile_call(trace->func, 0, NULL, NULL); function_profile_call(trace->func, 0, NULL, NULL);
if (index >= 0 && index < FTRACE_RETFUNC_DEPTH)
current->ret_stack[index].subtime = 0;
return 1; return 1;
} }

View file

@ -170,7 +170,6 @@ ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth,
current->ret_stack[index].ret = ret; current->ret_stack[index].ret = ret;
current->ret_stack[index].func = func; current->ret_stack[index].func = func;
current->ret_stack[index].calltime = calltime; current->ret_stack[index].calltime = calltime;
current->ret_stack[index].subtime = 0;
current->ret_stack[index].fp = frame_pointer; current->ret_stack[index].fp = frame_pointer;
*depth = current->curr_ret_stack; *depth = current->curr_ret_stack;