|
@@ -443,9 +443,7 @@ 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_GENERIC_CLOCKEVENTS_BROADCAST
|
|
@@ -548,7 +546,9 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
|
|
|
|
|
|
switch (ipinr) {
|
|
|
case IPI_TIMER:
|
|
|
+ irq_enter();
|
|
|
ipi_timer();
|
|
|
+ irq_exit();
|
|
|
break;
|
|
|
|
|
|
case IPI_RESCHEDULE:
|
|
@@ -556,15 +556,21 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
|
|
|
break;
|
|
|
|
|
|
case IPI_CALL_FUNC:
|
|
|
+ irq_enter();
|
|
|
generic_smp_call_function_interrupt();
|
|
|
+ irq_exit();
|
|
|
break;
|
|
|
|
|
|
case IPI_CALL_FUNC_SINGLE:
|
|
|
+ irq_enter();
|
|
|
generic_smp_call_function_single_interrupt();
|
|
|
+ irq_exit();
|
|
|
break;
|
|
|
|
|
|
case IPI_CPU_STOP:
|
|
|
+ irq_enter();
|
|
|
ipi_cpu_stop(cpu);
|
|
|
+ irq_exit();
|
|
|
break;
|
|
|
|
|
|
default:
|