Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xtensa: clear timer IRQ unconditionally in its handler

PIC irq_ack doesn't clear timer IRQ, because timer interrupt handler
usually set up new timer by writing to ccompare register and thus
clearing timer IRQ. However timer may not be set up in the IRQ handler,
e.g. with tickless idle on SMP, or when CPU is going offline, leaving
timer IRQ raised and making do_interrupt attempting to handle it
forever.

To fix this always write current value of ccompare SR chosen to be linux
timer back to that SR on entry to timer interrupt handler.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Signed-off-by: Chris Zankel <chris@zankel.net>

authored by

Max Filippov and committed by
Chris Zankel
bae07f8a 99623239

+1
+1
arch/xtensa/kernel/time.c
··· 158 158 { 159 159 struct clock_event_device *evt = &this_cpu_ptr(&ccount_timer)->evt; 160 160 161 + set_linux_timer(get_linux_timer()); 161 162 evt->event_handler(evt); 162 163 163 164 /* Allow platform to do something useful (Wdog). */