function_graph: Move ftrace_graph_ret_addr() to fgraph.c
Move the function function_graph_ret_addr() to fgraph.c, as the management of the curr_ret_stack is going to change, and all the accesses to ret_stack needs to be done in fgraph.c. Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
688f7089d8
commit
76b42b63ed
|
@ -232,6 +232,61 @@ unsigned long ftrace_return_to_handler(unsigned long frame_pointer)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ftrace_graph_ret_addr - convert a potentially modified stack return address
|
||||||
|
* to its original value
|
||||||
|
*
|
||||||
|
* This function can be called by stack unwinding code to convert a found stack
|
||||||
|
* return address ('ret') to its original value, in case the function graph
|
||||||
|
* tracer has modified it to be 'return_to_handler'. If the address hasn't
|
||||||
|
* been modified, the unchanged value of 'ret' is returned.
|
||||||
|
*
|
||||||
|
* 'idx' is a state variable which should be initialized by the caller to zero
|
||||||
|
* before the first call.
|
||||||
|
*
|
||||||
|
* 'retp' is a pointer to the return address on the stack. It's ignored if
|
||||||
|
* the arch doesn't have HAVE_FUNCTION_GRAPH_RET_ADDR_PTR defined.
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_FUNCTION_GRAPH_RET_ADDR_PTR
|
||||||
|
unsigned long ftrace_graph_ret_addr(struct task_struct *task, int *idx,
|
||||||
|
unsigned long ret, unsigned long *retp)
|
||||||
|
{
|
||||||
|
int index = task->curr_ret_stack;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (ret != (unsigned long)return_to_handler)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (index < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
for (i = 0; i <= index; i++)
|
||||||
|
if (task->ret_stack[i].retp == retp)
|
||||||
|
return task->ret_stack[i].ret;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else /* !HAVE_FUNCTION_GRAPH_RET_ADDR_PTR */
|
||||||
|
unsigned long ftrace_graph_ret_addr(struct task_struct *task, int *idx,
|
||||||
|
unsigned long ret, unsigned long *retp)
|
||||||
|
{
|
||||||
|
int task_idx;
|
||||||
|
|
||||||
|
if (ret != (unsigned long)return_to_handler)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
task_idx = task->curr_ret_stack;
|
||||||
|
|
||||||
|
if (!task->ret_stack || task_idx < *idx)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
task_idx -= *idx;
|
||||||
|
(*idx)++;
|
||||||
|
|
||||||
|
return task->ret_stack[task_idx].ret;
|
||||||
|
}
|
||||||
|
#endif /* HAVE_FUNCTION_GRAPH_RET_ADDR_PTR */
|
||||||
|
|
||||||
static struct ftrace_ops graph_ops = {
|
static struct ftrace_ops graph_ops = {
|
||||||
.func = ftrace_stub,
|
.func = ftrace_stub,
|
||||||
.flags = FTRACE_OPS_FL_RECURSION_SAFE |
|
.flags = FTRACE_OPS_FL_RECURSION_SAFE |
|
||||||
|
|
|
@ -94,61 +94,6 @@ static void
|
||||||
print_graph_duration(struct trace_array *tr, unsigned long long duration,
|
print_graph_duration(struct trace_array *tr, unsigned long long duration,
|
||||||
struct trace_seq *s, u32 flags);
|
struct trace_seq *s, u32 flags);
|
||||||
|
|
||||||
/**
|
|
||||||
* ftrace_graph_ret_addr - convert a potentially modified stack return address
|
|
||||||
* to its original value
|
|
||||||
*
|
|
||||||
* This function can be called by stack unwinding code to convert a found stack
|
|
||||||
* return address ('ret') to its original value, in case the function graph
|
|
||||||
* tracer has modified it to be 'return_to_handler'. If the address hasn't
|
|
||||||
* been modified, the unchanged value of 'ret' is returned.
|
|
||||||
*
|
|
||||||
* 'idx' is a state variable which should be initialized by the caller to zero
|
|
||||||
* before the first call.
|
|
||||||
*
|
|
||||||
* 'retp' is a pointer to the return address on the stack. It's ignored if
|
|
||||||
* the arch doesn't have HAVE_FUNCTION_GRAPH_RET_ADDR_PTR defined.
|
|
||||||
*/
|
|
||||||
#ifdef HAVE_FUNCTION_GRAPH_RET_ADDR_PTR
|
|
||||||
unsigned long ftrace_graph_ret_addr(struct task_struct *task, int *idx,
|
|
||||||
unsigned long ret, unsigned long *retp)
|
|
||||||
{
|
|
||||||
int index = task->curr_ret_stack;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (ret != (unsigned long)return_to_handler)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (index < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
for (i = 0; i <= index; i++)
|
|
||||||
if (task->ret_stack[i].retp == retp)
|
|
||||||
return task->ret_stack[i].ret;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#else /* !HAVE_FUNCTION_GRAPH_RET_ADDR_PTR */
|
|
||||||
unsigned long ftrace_graph_ret_addr(struct task_struct *task, int *idx,
|
|
||||||
unsigned long ret, unsigned long *retp)
|
|
||||||
{
|
|
||||||
int task_idx;
|
|
||||||
|
|
||||||
if (ret != (unsigned long)return_to_handler)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
task_idx = task->curr_ret_stack;
|
|
||||||
|
|
||||||
if (!task->ret_stack || task_idx < *idx)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
task_idx -= *idx;
|
|
||||||
(*idx)++;
|
|
||||||
|
|
||||||
return task->ret_stack[task_idx].ret;
|
|
||||||
}
|
|
||||||
#endif /* HAVE_FUNCTION_GRAPH_RET_ADDR_PTR */
|
|
||||||
|
|
||||||
int __trace_graph_entry(struct trace_array *tr,
|
int __trace_graph_entry(struct trace_array *tr,
|
||||||
struct ftrace_graph_ent *trace,
|
struct ftrace_graph_ent *trace,
|
||||||
unsigned long flags,
|
unsigned long flags,
|
||||||
|
|
Loading…
Reference in New Issue