diff options
author | Peter Zijlstra <peterz@infradead.org> | 2023-01-26 18:08:32 +0300 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2023-01-31 17:01:46 +0300 |
commit | d099dbfd330686a8c09cd8944bcc77a56f9e7815 (patch) | |
tree | e52a8d1889a8e74c361003fc7d9645a61c2b37df | |
parent | 5a5d7e9badd2cb8065db171961bd30bd3595e4b6 (diff) | |
download | linux-d099dbfd330686a8c09cd8944bcc77a56f9e7815.tar.xz |
cpuidle: tracing: Warn about !rcu_is_watching()
When using noinstr, WARN when tracing hits when RCU is disabled.
Suggested-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20230126151323.466670589@infradead.org
-rw-r--r-- | include/linux/trace_recursion.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/include/linux/trace_recursion.h b/include/linux/trace_recursion.h index c303f7a114e9..d48cd92d2364 100644 --- a/include/linux/trace_recursion.h +++ b/include/linux/trace_recursion.h @@ -135,6 +135,21 @@ extern void ftrace_record_recursion(unsigned long ip, unsigned long parent_ip); # define do_ftrace_record_recursion(ip, pip) do { } while (0) #endif +#ifdef CONFIG_ARCH_WANTS_NO_INSTR +# define trace_warn_on_no_rcu(ip) \ + ({ \ + bool __ret = !rcu_is_watching(); \ + if (__ret && !trace_recursion_test(TRACE_RECORD_RECURSION_BIT)) { \ + trace_recursion_set(TRACE_RECORD_RECURSION_BIT); \ + WARN_ONCE(true, "RCU not on for: %pS\n", (void *)ip); \ + trace_recursion_clear(TRACE_RECORD_RECURSION_BIT); \ + } \ + __ret; \ + }) +#else +# define trace_warn_on_no_rcu(ip) false +#endif + /* * Preemption is promised to be disabled when return bit >= 0. */ @@ -144,6 +159,9 @@ static __always_inline int trace_test_and_set_recursion(unsigned long ip, unsign unsigned int val = READ_ONCE(current->trace_recursion); int bit; + if (trace_warn_on_no_rcu(ip)) + return -1; + bit = trace_get_context_bit() + start; if (unlikely(val & (1 << bit))) { /* |