void smp_message_recv(unsigned int msg) { switch (msg) { case SMP_MSG_FUNCTION: generic_smp_call_function_interrupt(); break; case SMP_MSG_RESCHEDULE: break; case SMP_MSG_FUNCTION_SINGLE: generic_smp_call_function_single_interrupt(); break; case SMP_MSG_TIMER: ipi_timer(); break; default: printk(KERN_WARNING "SMP %d: %s(): unknown IPI %d\n", smp_processor_id(), __func__, msg); break; } }
static irqreturn_t ipi_handler_int1(int irq, void *dev_instance) { struct ipi_data *bfin_ipi_data; unsigned int cpu = smp_processor_id(); unsigned long pending; unsigned long msg; platform_clear_ipi(cpu, IRQ_SUPPLE_1); bfin_ipi_data = &__get_cpu_var(bfin_ipi); smp_mb(); while ((pending = xchg(&bfin_ipi_data->bits, 0)) != 0) { msg = 0; do { msg = find_next_bit(&pending, BITS_PER_LONG, msg + 1); switch (msg) { case BFIN_IPI_TIMER: ipi_timer(); break; case BFIN_IPI_RESCHEDULE: scheduler_ipi(); break; case BFIN_IPI_CALL_FUNC: generic_smp_call_function_interrupt(); break; case BFIN_IPI_CALL_FUNC_SINGLE: generic_smp_call_function_single_interrupt(); break; case BFIN_IPI_CPU_STOP: ipi_cpu_stop(cpu); break; } } while (msg < BITS_PER_LONG); smp_mb(); } return IRQ_HANDLED; }
static irqreturn_t ipi_handler_int1(int irq, void *dev_instance) { struct ipi_data *bfin_ipi_data; unsigned int cpu = smp_processor_id(); unsigned long pending; unsigned long msg; platform_clear_ipi(cpu, IRQ_SUPPLE_1); smp_rmb(); bfin_ipi_data = this_cpu_ptr(&bfin_ipi); while ((pending = atomic_xchg(&bfin_ipi_data->bits, 0)) != 0) { msg = 0; do { msg = find_next_bit(&pending, BITS_PER_LONG, msg + 1); switch (msg) { case BFIN_IPI_TIMER: ipi_timer(); break; case BFIN_IPI_RESCHEDULE: scheduler_ipi(); break; case BFIN_IPI_CALL_FUNC: generic_smp_call_function_interrupt(); break; case BFIN_IPI_CPU_STOP: ipi_cpu_stop(cpu); break; default: goto out; } atomic_dec(&bfin_ipi_data->count); } while (msg < BITS_PER_LONG); } out: return IRQ_HANDLED; }
void smp_message_recv(unsigned int msg) { switch (msg) { case SMP_MSG_FUNCTION: generic_smp_call_function_interrupt(); break; case SMP_MSG_RESCHEDULE: scheduler_ipi(); break; case SMP_MSG_FUNCTION_SINGLE: generic_smp_call_function_single_interrupt(); break; #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST case SMP_MSG_TIMER: ipi_timer(); break; #endif default: printk(KERN_WARNING "SMP %d: %s(): unknown IPI %d\n", smp_processor_id(), __func__, msg); break; } }