diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2023-03-17 14:01:30 +0300 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2023-03-17 14:01:30 +0300 |
| commit | d26a3a6ce7e02f9c056ad992bcd9624735022337 (patch) | |
| tree | 9df8aeaceed50bf65d01172c67f67035c9fa59ef /include/linux/trace_recursion.h | |
| parent | 007e50eb5dbe7b33a43a1449a0d9c29e8dcf1c67 (diff) | |
| parent | eeac8ede17557680855031c6f305ece2378af326 (diff) | |
| download | linux-d26a3a6ce7e02f9c056ad992bcd9624735022337.tar.xz | |
Merge tag 'v6.3-rc2' into next
Merge with mainline to get of_property_present() and other newer APIs.
Diffstat (limited to 'include/linux/trace_recursion.h')
| -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))) { /* |
