aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/ftrace.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 44e826a79665..080b7d41e17f 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -4388,12 +4388,21 @@ ftrace_ops_control_func(unsigned long ip, unsigned long parent_ip,
4388 */ 4388 */
4389 preempt_disable_notrace(); 4389 preempt_disable_notrace();
4390 trace_recursion_set(TRACE_CONTROL_BIT); 4390 trace_recursion_set(TRACE_CONTROL_BIT);
4391
4392 /*
4393 * Control funcs (perf) uses RCU. Only trace if
4394 * RCU is currently active.
4395 */
4396 if (!rcu_is_watching())
4397 goto out;
4398
4391 do_for_each_ftrace_op(op, ftrace_control_list) { 4399 do_for_each_ftrace_op(op, ftrace_control_list) {
4392 if (!(op->flags & FTRACE_OPS_FL_STUB) && 4400 if (!(op->flags & FTRACE_OPS_FL_STUB) &&
4393 !ftrace_function_local_disabled(op) && 4401 !ftrace_function_local_disabled(op) &&
4394 ftrace_ops_test(op, ip, regs)) 4402 ftrace_ops_test(op, ip, regs))
4395 op->func(ip, parent_ip, op, regs); 4403 op->func(ip, parent_ip, op, regs);
4396 } while_for_each_ftrace_op(op); 4404 } while_for_each_ftrace_op(op);
4405 out:
4397 trace_recursion_clear(TRACE_CONTROL_BIT); 4406 trace_recursion_clear(TRACE_CONTROL_BIT);
4398 preempt_enable_notrace(); 4407 preempt_enable_notrace();
4399} 4408}