Skip to content

Commit f6efc18

Browse files
jcmvbkbcgregkh
authored andcommitted
xtensa: SMP: fix ccount_timer_shutdown
[ Upstream commit 4fe8713 ] ccount_timer_shutdown is called from the atomic context in the secondary_start_kernel, resulting in the following BUG: BUG: sleeping function called from invalid context in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/1 Preemption disabled at: secondary_start_kernel+0xa1/0x130 Call Trace: ___might_sleep+0xe7/0xfc __might_sleep+0x41/0x44 synchronize_irq+0x24/0x64 disable_irq+0x11/0x14 ccount_timer_shutdown+0x12/0x20 clockevents_switch_state+0x82/0xb4 clockevents_exchange_device+0x54/0x60 tick_check_new_device+0x46/0x70 clockevents_register_device+0x8c/0xc8 clockevents_config_and_register+0x1d/0x2c local_timer_setup+0x75/0x7c secondary_start_kernel+0xb4/0x130 should_never_return+0x32/0x35 Use disable_irq_nosync instead of disable_irq to avoid it. This is safe because the ccount timer IRQ is per-CPU, and once IRQ is masked the ISR will not be called. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 9974f32 commit f6efc18

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

arch/xtensa/kernel/time.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ static int ccount_timer_shutdown(struct clock_event_device *evt)
8787
container_of(evt, struct ccount_timer, evt);
8888

8989
if (timer->irq_enabled) {
90-
disable_irq(evt->irq);
90+
disable_irq_nosync(evt->irq);
9191
timer->irq_enabled = 0;
9292
}
9393
return 0;

0 commit comments

Comments
 (0)