unsigned long mask = 0;
 
        for_each_cpu(index, callmask)
-               if (index != smp_processor_id())
-                       mask |= 1 << index;
+               mask |= 1 << index;
 
        set_er(mask, MIPISET(msg_id));
 }
 {
        unsigned int cpu = smp_processor_id();
        struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
-       unsigned int msg;
-       unsigned i;
 
-       msg = get_er(MIPICAUSE(cpu));
-       for (i = 0; i < IPI_MAX; i++)
-               if (msg & (1 << i)) {
-                       set_er(1 << i, MIPICAUSE(cpu));
-                       ++ipi->ipi_count[i];
+       for (;;) {
+               unsigned int msg;
+
+               msg = get_er(MIPICAUSE(cpu));
+               set_er(msg, MIPICAUSE(cpu));
+
+               if (!msg)
+                       break;
+
+               if (msg & (1 << IPI_CALL_FUNC)) {
+                       ++ipi->ipi_count[IPI_CALL_FUNC];
+                       generic_smp_call_function_interrupt();
                }
 
-       if (msg & (1 << IPI_RESCHEDULE))
-               scheduler_ipi();
-       if (msg & (1 << IPI_CALL_FUNC))
-               generic_smp_call_function_interrupt();
-       if (msg & (1 << IPI_CPU_STOP))
-               ipi_cpu_stop(cpu);
+               if (msg & (1 << IPI_RESCHEDULE)) {
+                       ++ipi->ipi_count[IPI_RESCHEDULE];
+                       scheduler_ipi();
+               }
+
+               if (msg & (1 << IPI_CPU_STOP)) {
+                       ++ipi->ipi_count[IPI_CPU_STOP];
+                       ipi_cpu_stop(cpu);
+               }
+       }
 
        return IRQ_HANDLED;
 }