diff options
author | Shreyas B. Prabhu <shreyas@linux.vnet.ibm.com> | 2015-05-28 18:44:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-05-28 21:25:18 -0400 |
commit | e5feb1ebaadfb1f5f70a3591e762d780232a4f5d (patch) | |
tree | 630854c9c522064176ec9ba4cfba5bc1d398b31c /include/trace | |
parent | de182468d1bb726198abaab315820542425270b7 (diff) |
tracing/mm: don't trace kmem_cache_free on offline cpus
Since tracepoints use RCU for protection, they must not be called on
offline cpus. trace_kmem_cache_free can be called on an offline cpu in
this scenario caught by LOCKDEP:
===============================
[ INFO: suspicious RCU usage. ]
4.1.0-rc1+ #9 Not tainted
-------------------------------
include/trace/events/kmem.h:148 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/1/0.
stack backtrace:
CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.1.0-rc1+ #9
Call Trace:
.dump_stack+0x98/0xd4 (unreliable)
.lockdep_rcu_suspicious+0x108/0x170
.kmem_cache_free+0x344/0x4b0
.__mmdrop+0x4c/0x160
.idle_task_exit+0xf0/0x100
.pnv_smp_cpu_kill_self+0x58/0x2c0
.cpu_die+0x34/0x50
.arch_cpu_idle_dead+0x20/0x40
.cpu_startup_entry+0x708/0x7a0
.start_secondary+0x36c/0x3a0
start_secondary_prolog+0x10/0x14
Fix this by converting kmem_cache_free trace point into
TRACE_EVENT_CONDITION where condition is cpu_online(smp_processor_id())
Signed-off-by: Shreyas B. Prabhu <shreyas@linux.vnet.ibm.com>
Reported-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Reviewed-by: Preeti U Murthy <preeti@linux.vnet.ibm.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/trace')
-rw-r--r-- | include/trace/events/kmem.h | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h index 81ea59812117..78efa0a197a9 100644 --- a/include/trace/events/kmem.h +++ b/include/trace/events/kmem.h | |||
@@ -140,11 +140,22 @@ DEFINE_EVENT(kmem_free, kfree, | |||
140 | TP_ARGS(call_site, ptr) | 140 | TP_ARGS(call_site, ptr) |
141 | ); | 141 | ); |
142 | 142 | ||
143 | DEFINE_EVENT(kmem_free, kmem_cache_free, | 143 | DEFINE_EVENT_CONDITION(kmem_free, kmem_cache_free, |
144 | 144 | ||
145 | TP_PROTO(unsigned long call_site, const void *ptr), | 145 | TP_PROTO(unsigned long call_site, const void *ptr), |
146 | 146 | ||
147 | TP_ARGS(call_site, ptr) | 147 | TP_ARGS(call_site, ptr), |
148 | |||
149 | /* | ||
150 | * This trace can be potentially called from an offlined cpu. | ||
151 | * Since trace points use RCU and RCU should not be used from | ||
152 | * offline cpus, filter such calls out. | ||
153 | * While this trace can be called from a preemptable section, | ||
154 | * it has no impact on the condition since tasks can migrate | ||
155 | * only from online cpus to other online cpus. Thus its safe | ||
156 | * to use raw_smp_processor_id. | ||
157 | */ | ||
158 | TP_CONDITION(cpu_online(raw_smp_processor_id())) | ||
148 | ); | 159 | ); |
149 | 160 | ||
150 | TRACE_EVENT(mm_page_free, | 161 | TRACE_EVENT(mm_page_free, |