diff options
-rw-r--r-- | kernel/trace/ftrace.c | 9 |
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 | } |