ftrace: add ftrace_graph_stop()
Impact: new ftrace_graph_stop function While developing more features of function graph, I hit a bug that caused the WARN_ON to trigger in the prepare_ftrace_return function. Well, it was hard for me to find out that was happening because the bug would not print, it would just cause a hard lockup or reboot. The reason is that it is not safe to call printk from this function. Looking further, I also found that it calls unregister_ftrace_graph, which grabs a mutex and calls kstop machine. This would definitely lock the box up if it were to trigger. This patch adds a fast and safe ftrace_graph_stop() which will stop the function tracer. Then it is safe to call the WARN ON. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
bb4304c71c
commit
14a866c567
3 changed files with 13 additions and 4 deletions
|
@ -484,14 +484,16 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
||||||
: "memory"
|
: "memory"
|
||||||
);
|
);
|
||||||
|
|
||||||
if (WARN_ON(faulted)) {
|
if (unlikely(faulted)) {
|
||||||
unregister_ftrace_graph();
|
ftrace_graph_stop();
|
||||||
|
WARN_ON(1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WARN_ON(!__kernel_text_address(old))) {
|
if (unlikely(!__kernel_text_address(old))) {
|
||||||
unregister_ftrace_graph();
|
ftrace_graph_stop();
|
||||||
*parent = old;
|
*parent = old;
|
||||||
|
WARN_ON(1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -376,6 +376,8 @@ typedef void (*trace_func_graph_ent_t)(struct ftrace_graph_ent *); /* entry */
|
||||||
extern int register_ftrace_graph(trace_func_graph_ret_t retfunc,
|
extern int register_ftrace_graph(trace_func_graph_ret_t retfunc,
|
||||||
trace_func_graph_ent_t entryfunc);
|
trace_func_graph_ent_t entryfunc);
|
||||||
|
|
||||||
|
extern void ftrace_graph_stop(void);
|
||||||
|
|
||||||
/* The current handlers in use */
|
/* The current handlers in use */
|
||||||
extern trace_func_graph_ret_t ftrace_graph_return;
|
extern trace_func_graph_ret_t ftrace_graph_return;
|
||||||
extern trace_func_graph_ent_t ftrace_graph_entry;
|
extern trace_func_graph_ent_t ftrace_graph_entry;
|
||||||
|
|
|
@ -1769,5 +1769,10 @@ void ftrace_graph_exit_task(struct task_struct *t)
|
||||||
|
|
||||||
kfree(ret_stack);
|
kfree(ret_stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ftrace_graph_stop(void)
|
||||||
|
{
|
||||||
|
ftrace_stop();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue