Skip to content
This repository was archived by the owner on Dec 20, 2023. It is now read-only.

Commit 6c8465a

Browse files
committed
x86/tlb/trace: Do not trace on CPU that is offline
When taking a CPU down for suspend and resume, a tracepoint may be called when the CPU has been designated offline. As tracepoints require RCU for protection, they must not be called if the current CPU is offline. Unfortunately, trace_tlb_flush() is called in this scenario as was noted by LOCKDEP: ... Disabling non-boot CPUs ... intel_pstate CPU 1 exiting =============================== smpboot: CPU 1 didn't die... [ INFO: suspicious RCU usage. ] 3.19.0-rc7-next-20150204.1-iniza-small #1 Not tainted ------------------------------- include/trace/events/tlb.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 = 0 no locks held by swapper/1/0. stack backtrace: CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.19.0-rc7-next-20150204.1-iniza-small #1 Hardware name: SAMSUNG ELECTRONICS CO., LTD. 530U3BI/530U4BI/530U4BH/530U3BI/530U4BI/530U4BH, BIOS 13XK 03/28/2013 0000000000000001 ffff88011a44fe18 ffffffff817e370d 0000000000000011 ffff88011a448290 ffff88011a44fe48 ffffffff810d6847 ffff8800c66b9600 0000000000000001 ffff88011a44c000 ffffffff81cb3900 ffff88011a44fe78 Call Trace: [<ffffffff817e370d>] dump_stack+0x4c/0x65 [<ffffffff810d6847>] lockdep_rcu_suspicious+0xe7/0x120 [<ffffffff810b71a5>] idle_task_exit+0x205/0x2c0 [<ffffffff81054c4e>] play_dead_common+0xe/0x50 [<ffffffff81054ca5>] native_play_dead+0x15/0x140 [<ffffffff8102963f>] arch_cpu_idle_dead+0xf/0x20 [<ffffffff810cd89e>] cpu_startup_entry+0x37e/0x580 [<ffffffff81053e20>] start_secondary+0x140/0x150 intel_pstate CPU 2 exiting ... By converting the tlb_flush tracepoint to a TRACE_EVENT_CONDITION where the condition is cpu_online(smp_processor_id()), we can avoid calling RCU protected code when the CPU is offline. Link: http://lkml.kernel.org/r/CA+icZUUGiGDoL5NU8RuxKzFjoLjEKRtUWx=JB8B9a0EQv-eGzQ@mail.gmail.com Cc: [email protected] # 3.17+ Fixes: d17d8f9 "x86/mm: Add tracepoints for TLB flushes" Reported-by: Sedat Dilek <[email protected]> Tested-by: Sedat Dilek <[email protected]> Suggested-by: Paul E. McKenney <[email protected]> Acked-by: Paul E. McKenney <[email protected]> Acked-by: Dave Hansen <[email protected]> Signed-off-by: Steven Rostedt <[email protected]>
1 parent a05d59a commit 6c8465a

File tree

1 file changed

+3
-1
lines changed
  • include/trace/events

1 file changed

+3
-1
lines changed

include/trace/events/tlb.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
{ TLB_LOCAL_SHOOTDOWN, "local shootdown" }, \
1414
{ TLB_LOCAL_MM_SHOOTDOWN, "local mm shootdown" }
1515

16-
TRACE_EVENT(tlb_flush,
16+
TRACE_EVENT_CONDITION(tlb_flush,
1717

1818
TP_PROTO(int reason, unsigned long pages),
1919
TP_ARGS(reason, pages),
2020

21+
TP_CONDITION(cpu_online(smp_processor_id())),
22+
2123
TP_STRUCT__entry(
2224
__field( int, reason)
2325
__field(unsigned long, pages)

0 commit comments

Comments
 (0)