Commit eb2be84e authored by Steven Rostedt (Red Hat)'s avatar Steven Rostedt (Red Hat) Committed by Jiri Slaby

tracing: Fix check for cpu online when event is disabled

commit dc17147d upstream.

Commit f3775549 ("tracepoints: Do not trace when cpu is offline") added
a check to make sure that tracepoints only get called when the cpu is
online, as it uses rcu_read_lock_sched() for protection.

Commit 3a630178 ("tracing: generate RCU warnings even when tracepoints
are disabled") added lockdep checks (including rcu checks) for events that
are not enabled to catch possible RCU issues that would only be triggered if
a trace event was enabled. Commit f3775549 only stopped the warnings
when the trace event was enabled but did not prevent warnings if the trace
event was called when disabled.

To fix this, the cpu online check is moved to where the condition is added
to the trace event. This will place the cpu online check in all places that
it may be used now and in the future.

Fixes: f3775549 ("tracepoints: Do not trace when cpu is offline")
Fixes: 3a630178 ("tracing: generate RCU warnings even when tracepoints are disabled")
Reported-by: default avatarSudeep Holla <sudeep.holla@arm.com>
Tested-by: default avatarSudeep Holla <sudeep.holla@arm.com>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b6199e8f
...@@ -129,9 +129,6 @@ static inline void tracepoint_synchronize_unregister(void) ...@@ -129,9 +129,6 @@ static inline void tracepoint_synchronize_unregister(void)
void *it_func; \ void *it_func; \
void *__data; \ void *__data; \
\ \
if (!cpu_online(raw_smp_processor_id())) \
return; \
\
if (!(cond)) \ if (!(cond)) \
return; \ return; \
prercu; \ prercu; \
...@@ -265,15 +262,19 @@ static inline void tracepoint_synchronize_unregister(void) ...@@ -265,15 +262,19 @@ static inline void tracepoint_synchronize_unregister(void)
* "void *__data, proto" as the callback prototype. * "void *__data, proto" as the callback prototype.
*/ */
#define DECLARE_TRACE_NOARGS(name) \ #define DECLARE_TRACE_NOARGS(name) \
__DECLARE_TRACE(name, void, , 1, void *__data, __data) __DECLARE_TRACE(name, void, , \
cpu_online(raw_smp_processor_id()), \
void *__data, __data)
#define DECLARE_TRACE(name, proto, args) \ #define DECLARE_TRACE(name, proto, args) \
__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), 1, \ __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
cpu_online(raw_smp_processor_id()), \
PARAMS(void *__data, proto), \ PARAMS(void *__data, proto), \
PARAMS(__data, args)) PARAMS(__data, args))
#define DECLARE_TRACE_CONDITION(name, proto, args, cond) \ #define DECLARE_TRACE_CONDITION(name, proto, args, cond) \
__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), PARAMS(cond), \ __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
cpu_online(raw_smp_processor_id()) && (PARAMS(cond)), \
PARAMS(void *__data, proto), \ PARAMS(void *__data, proto), \
PARAMS(__data, args)) PARAMS(__data, args))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment