| From dc17147de328a74bbdee67c1bf37d2f1992de756 Mon Sep 17 00:00:00 2001 |
| From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org> |
| Date: Wed, 9 Mar 2016 11:58:41 -0500 |
| Subject: tracing: Fix check for cpu online when event is disabled |
| |
| From: Steven Rostedt (Red Hat) <rostedt@goodmis.org> |
| |
| commit dc17147de328a74bbdee67c1bf37d2f1992de756 upstream. |
| |
| Commit f37755490fe9b ("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 3a630178fd5f3 ("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 f37755490fe9b 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: f37755490fe9b ("tracepoints: Do not trace when cpu is offline") |
| Fixes: 3a630178fd5f3 ("tracing: generate RCU warnings even when tracepoints are disabled") |
| Reported-by: Sudeep Holla <sudeep.holla@arm.com> |
| Tested-by: Sudeep Holla <sudeep.holla@arm.com> |
| Signed-off-by: Steven Rostedt <rostedt@goodmis.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| include/linux/tracepoint.h | 17 +++++++++-------- |
| 1 file changed, 9 insertions(+), 8 deletions(-) |
| |
| --- a/include/linux/tracepoint.h |
| +++ b/include/linux/tracepoint.h |
| @@ -129,9 +129,6 @@ static inline void tracepoint_synchroniz |
| void *it_func; \ |
| void *__data; \ |
| \ |
| - if (!cpu_online(raw_smp_processor_id())) \ |
| - return; \ |
| - \ |
| if (!(cond)) \ |
| return; \ |
| prercu; \ |
| @@ -265,15 +262,19 @@ static inline void tracepoint_synchroniz |
| * "void *__data, proto" as the callback prototype. |
| */ |
| #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) \ |
| - __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), 1, \ |
| - PARAMS(void *__data, proto), \ |
| - PARAMS(__data, args)) |
| + __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \ |
| + cpu_online(raw_smp_processor_id()), \ |
| + PARAMS(void *__data, proto), \ |
| + PARAMS(__data, args)) |
| |
| #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(__data, args)) |
| |