[PATCH -next] tracepoint: ipi: don't trace IPI on offline CPUs

From: Sudeep Holla
Date: Wed Mar 09 2016 - 07:22:46 EST


Tracepoints use RCU for protection and they must not be called on
offline CPUS. So make this tracepoint conditional. Otherwise it can
produce the following warning:

===============================
[ INFO: suspicious RCU usage. ]
4.5.0-rc7-next-20160308 #44 Not tainted
-------------------------------
include/trace/events/ipi.h:35 suspicious rcu_dereference_check() usage!

other info that might help us debug this:

RCU used illegally from offline CPU!
rcu_scheduler_active = 1, debug_locks = 1
no locks held by swapper/3/0.

stack backtrace:
CPU: 3 PID: 0 Comm: swapper/3 Not tainted 4.5.0-rc7-next-20160308 #44
Hardware name: ARM Juno development board (r2) (DT)
Call trace:
dump_backtrace+0x0/0x218
show_stack+0x24/0x30
dump_stack+0xb4/0xf0
lockdep_rcu_suspicious+0xd0/0x118
smp_cross_call+0x1a8/0x1b0
arch_send_call_function_single_ipi+0x3c/0x48
generic_exec_single+0xc0/0x178
smp_call_function_single+0xec/0x1b8
cpuhp_report_idle_dead+0x70/0x88
cpu_startup_entry+0x358/0x3c0
secondary_start_kernel+0x190/0x1e8

Cc: Steven Rostedt <rostedt@xxxxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxxxxx>
Signed-off-by: Sudeep Holla <sudeep.holla@xxxxxxx>
---
include/trace/events/ipi.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

Hi Steven,

I observed that in "include/linux/tracepoint.h", we have
#define __DO_TRACE(tp, proto, args, cond, prercu, postrcu)
...
if (!cpu_online(raw_smp_processor_id()))
return;

if (!(cond))
return;
...

where !cond check seems reduntant if it's cpu_online check.
So, does this patch handle the warning correctly or is there any better
way ? I did see few traces with same condition, just thought of checking
with you.

Regards,
Sudeep

diff --git a/include/trace/events/ipi.h b/include/trace/events/ipi.h
index 834a7362a610..d8ca2f2e24ac 100644
--- a/include/trace/events/ipi.h
+++ b/include/trace/events/ipi.h
@@ -15,12 +15,14 @@
* It is necessary for @reason to be a static string declared with
* __tracepoint_string.
*/
-TRACE_EVENT(ipi_raise,
+TRACE_EVENT_CONDITION(ipi_raise,

TP_PROTO(const struct cpumask *mask, const char *reason),

TP_ARGS(mask, reason),

+ TP_CONDITION(cpu_online(raw_smp_processor_id())),
+
TP_STRUCT__entry(
__bitmask(target_cpus, nr_cpumask_bits)
__field(const char *, reason)
--
1.9.1