From: "Steven Rostedt (VMware)" <rost...@goodmis.org>

Signed-off-by: Steven Rostedt (VMware) <rost...@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


Reply via email to