|
@@ -51,7 +51,8 @@
|
|
|
struct secondary_data secondary_data;
|
|
|
|
|
|
enum ipi_msg_type {
|
|
|
- IPI_TIMER = 2,
|
|
|
+ IPI_WAKEUP,
|
|
|
+ IPI_TIMER,
|
|
|
IPI_RESCHEDULE,
|
|
|
IPI_CALL_FUNC,
|
|
|
IPI_CALL_FUNC_SINGLE,
|
|
@@ -347,7 +348,8 @@ void arch_send_call_function_single_ipi(int cpu)
|
|
|
}
|
|
|
|
|
|
static const char *ipi_types[NR_IPI] = {
|
|
|
-#define S(x,s) [x - IPI_TIMER] = s
|
|
|
+#define S(x,s) [x] = s
|
|
|
+ S(IPI_WAKEUP, "CPU wakeup interrupts"),
|
|
|
S(IPI_TIMER, "Timer broadcast interrupts"),
|
|
|
S(IPI_RESCHEDULE, "Rescheduling interrupts"),
|
|
|
S(IPI_CALL_FUNC, "Function call interrupts"),
|
|
@@ -500,10 +502,13 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
|
|
|
unsigned int cpu = smp_processor_id();
|
|
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
|
|
|
|
|
- if (ipinr >= IPI_TIMER && ipinr < IPI_TIMER + NR_IPI)
|
|
|
- __inc_irq_stat(cpu, ipi_irqs[ipinr - IPI_TIMER]);
|
|
|
+ if (ipinr < NR_IPI)
|
|
|
+ __inc_irq_stat(cpu, ipi_irqs[ipinr]);
|
|
|
|
|
|
switch (ipinr) {
|
|
|
+ case IPI_WAKEUP:
|
|
|
+ break;
|
|
|
+
|
|
|
case IPI_TIMER:
|
|
|
irq_enter();
|
|
|
ipi_timer();
|