ARM: Fix calling ipi_timer() from local timer IRQ
Antti P Miettinen [Wed, 4 Apr 2012 17:59:52 +0000 (20:59 +0300)]
Commit d4c9c46147102dfc403691ed52609ae36ba5df08 moved
irq_enter()/irq_exit() calls around. This caused
irq_enter()/irq_exit() for ipi_timer() to be missing
when ipi_timer() was called from local timer IRQ.
Add the missing calls.

Bug 961231

Change-Id: I32bfdf2620ca3df31d90f16924b06f4a1e24c0b7
Signed-off-by: Antti P Miettinen <amiettinen@nvidia.com>
Signed-off-by: Shridhar Rasal <srasal@nvidia.com>
Reviewed-on: http://git-master/r/94566
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>

arch/arm/kernel/smp.c

index 31a129b..bdfb37c 100644 (file)
@@ -457,7 +457,9 @@ static DEFINE_PER_CPU(struct clock_event_device, percpu_clockevent);
 static void ipi_timer(void)
 {
        struct clock_event_device *evt = &__get_cpu_var(percpu_clockevent);
+       irq_enter();
        evt->event_handler(evt);
+       irq_exit();
 }
 
 #ifdef CONFIG_LOCAL_TIMERS
@@ -630,9 +632,7 @@ asmlinkage void __exception_irq_entry do_IPI(int ipinr, struct pt_regs *regs)
 
        switch (ipinr) {
        case IPI_TIMER:
-               irq_enter();
                ipi_timer();
-               irq_exit();
                break;
 
        case IPI_RESCHEDULE: