m68k: Call timer_interrupt() with interrupts disabled
Some platforms execute their timer handler with the interrupt priority level set below 6. That means the handler could be interrupted by another driver and this could lead to re-entry of the timer core. Avoid this by use of local_irq_save/restore for timer interrupt dispatch. This provides mutual exclusion around the timer interrupt flag access which is needed later in this series for the clocksource conversion. Reported-by: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/alpine.DEB.2.21.1811131407120.2697@nanos.tec.linutronix.de Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Esse commit está contido em:
@@ -38,13 +38,19 @@
|
||||
|
||||
static irqreturn_t hp300_tick(int irq, void *dev_id)
|
||||
{
|
||||
irq_handler_t timer_routine = dev_id;
|
||||
unsigned long flags;
|
||||
unsigned long tmp;
|
||||
irq_handler_t vector = dev_id;
|
||||
|
||||
local_irq_save(flags);
|
||||
in_8(CLOCKBASE + CLKSR);
|
||||
asm volatile ("movpw %1@(5),%0" : "=d" (tmp) : "a" (CLOCKBASE));
|
||||
timer_routine(0, NULL);
|
||||
local_irq_restore(flags);
|
||||
|
||||
/* Turn off the network and SCSI leds */
|
||||
blinken_leds(0, 0xe0);
|
||||
return vector(irq, NULL);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
u32 hp300_gettimeoffset(void)
|
||||
|
Referência em uma nova issue
Block a user