提交 14a866c5 编写于 作者: S Steven Rostedt 提交者: Ingo Molnar

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: NSteven Rostedt <srostedt@redhat.com>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 bb4304c7
...@@ -484,14 +484,16 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) ...@@ -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 */ ...@@ -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) ...@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册