Messages in this thread Patch in this message | | | Date | Wed, 21 Nov 2018 20:27:22 -0500 | From | Steven Rostedt <> | Subject | [RFC][PATCH 14/14] function_graph: Allow for more than one callback to be registered |
| |
From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> --- kernel/trace/fgraph.c | 50 +++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 23 deletions(-)
diff --git a/kernel/trace/fgraph.c b/kernel/trace/fgraph.c index 6e5efe1663b9..8a99eaa46b43 100644 --- a/kernel/trace/fgraph.c +++ b/kernel/trace/fgraph.c @@ -753,24 +753,27 @@ int register_ftrace_graph(struct fgraph_ops *gops) register_pm_notifier(&ftrace_suspend_notifier); ftrace_graph_active++; - ret = start_graph_tracing(); - if (ret) { - ftrace_graph_active--; - goto out; - } + if (ftrace_graph_active == 1) { + ret = start_graph_tracing(); + if (ret) { + ftrace_graph_active--; + goto out; + } - ftrace_graph_return = gops->retfunc; - /* - * Update the indirect function to the entryfunc, and the - * function that gets called to the entry_test first. Then - * call the update fgraph entry function to determine if - * the entryfunc should be called directly or not. - */ - __ftrace_graph_entry = gops->entryfunc; - ftrace_graph_entry = ftrace_graph_entry_test; - update_function_graph_func(); + ftrace_graph_return = gops->retfunc; - ret = ftrace_startup(&graph_ops, FTRACE_START_FUNC_RET); + /* + * Update the indirect function to the entryfunc, and the + * function that gets called to the entry_test first. Then + * call the update fgraph entry function to determine if + * the entryfunc should be called directly or not. + */ + __ftrace_graph_entry = gops->entryfunc; + ftrace_graph_entry = ftrace_graph_entry_test; + update_function_graph_func(); + + ret = ftrace_startup(&graph_ops, FTRACE_START_FUNC_RET); + } out: mutex_unlock(&ftrace_lock); return ret; @@ -800,13 +803,14 @@ void unregister_ftrace_graph(struct fgraph_ops *gops) } ftrace_graph_active--; - ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub; - ftrace_graph_entry = ftrace_graph_entry_stub; - __ftrace_graph_entry = ftrace_graph_entry_stub; - ftrace_shutdown(&graph_ops, FTRACE_STOP_FUNC_RET); - unregister_pm_notifier(&ftrace_suspend_notifier); - unregister_trace_sched_switch(ftrace_graph_probe_sched_switch, NULL); - + if (ftrace_graph_active == 0) { + ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub; + ftrace_graph_entry = ftrace_graph_entry_stub; + __ftrace_graph_entry = ftrace_graph_entry_stub; + ftrace_shutdown(&graph_ops, FTRACE_STOP_FUNC_RET); + unregister_pm_notifier(&ftrace_suspend_notifier); + unregister_trace_sched_switch(ftrace_graph_probe_sched_switch, NULL); + } out: mutex_unlock(&ftrace_lock); } -- 2.19.1
| |