Skip to content

Commit 29368e0

Browse files
committed
x86/smpboot: Move rcu_cpu_starting() earlier
The call to rcu_cpu_starting() in mtrr_ap_init() is not early enough in the CPU-hotplug onlining process, which results in lockdep splats as follows: ============================= WARNING: suspicious RCU usage 5.9.0+ torvalds#268 Not tainted ----------------------------- kernel/kprobes.c:300 RCU-list traversed in non-reader section!! 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 5.9.0+ torvalds#268 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.10.2-1ubuntu1 04/01/2014 Call Trace: dump_stack+0x77/0x97 __is_insn_slot_addr+0x15d/0x170 kernel_text_address+0xba/0xe0 ? get_stack_info+0x22/0xa0 __kernel_text_address+0x9/0x30 show_trace_log_lvl+0x17d/0x380 ? dump_stack+0x77/0x97 dump_stack+0x77/0x97 __lock_acquire+0xdf7/0x1bf0 lock_acquire+0x258/0x3d0 ? vprintk_emit+0x6d/0x2c0 _raw_spin_lock+0x27/0x40 ? vprintk_emit+0x6d/0x2c0 vprintk_emit+0x6d/0x2c0 printk+0x4d/0x69 start_secondary+0x1c/0x100 secondary_startup_64_no_verify+0xb8/0xbb This is avoided by moving the call to rcu_cpu_starting up near the beginning of the start_secondary() function. Note that the raw_smp_processor_id() is required in order to avoid calling into lockdep before RCU has declared the CPU to be watched for readers. Link: https://lore.kernel.org/lkml/160223032121.7002.1269740091547117869.tip-bot2@tip-bot2/ Reported-by: Qian Cai <[email protected]> Suggested-by: Peter Zijlstra <[email protected]> Signed-off-by: Paul E. McKenney <[email protected]>
1 parent 6dbce04 commit 29368e0

File tree

2 files changed

+1
-2
lines changed

2 files changed

+1
-2
lines changed

arch/x86/kernel/cpu/mtrr/mtrr.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -794,8 +794,6 @@ void mtrr_ap_init(void)
794794
if (!use_intel() || mtrr_aps_delayed_init)
795795
return;
796796

797-
rcu_cpu_starting(smp_processor_id());
798-
799797
/*
800798
* Ideally we should hold mtrr_mutex here to avoid mtrr entries
801799
* changed, but this routine will be called in cpu boot time,

arch/x86/kernel/smpboot.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ static void notrace start_secondary(void *unused)
229229
#endif
230230
cpu_init_exception_handling();
231231
cpu_init();
232+
rcu_cpu_starting(raw_smp_processor_id());
232233
x86_cpuinit.early_percpu_clock_init();
233234
preempt_disable();
234235
smp_callin();

0 commit comments

Comments
 (0)