xtensa: SMP: fix ccount_timer_shutdown
authorMax Filippov <jcmvbkbc@gmail.com>
Mon, 29 Jan 2018 17:09:41 +0000 (09:09 -0800)
committerMax Filippov <jcmvbkbc@gmail.com>
Fri, 25 Jan 2019 00:01:07 +0000 (16:01 -0800)
commit4fe8713b873fc881284722ce4ac47995de7cf62c
treea0f59cd76c820fc96107b5491936ad1581fb6867
parent49a57857aeea06ca831043acbb0fa5e0f50602fd
xtensa: SMP: fix ccount_timer_shutdown

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>
arch/xtensa/kernel/time.c