Example #1
0
/* sync-free variant. Callers should ensure synchronization */
irqreturn_t smp_ipi_demux_relaxed(void)
{
	struct cpu_messages *info;
	unsigned long all;

	info = this_cpu_ptr(&ipi_message);
	do {
		all = xchg(&info->messages, 0);
#if defined(CONFIG_KVM_XICS) && defined(CONFIG_KVM_BOOK3S_HV_POSSIBLE)
		/*
		 * Must check for PPC_MSG_RM_HOST_ACTION messages
		 * before PPC_MSG_CALL_FUNCTION messages because when
		 * a VM is destroyed, we call kick_all_cpus_sync()
		 * to ensure that any pending PPC_MSG_RM_HOST_ACTION
		 * messages have completed before we free any VCPUs.
		 */
		if (all & IPI_MESSAGE(PPC_MSG_RM_HOST_ACTION))
			kvmppc_xics_ipi_action();
#endif
		if (all & IPI_MESSAGE(PPC_MSG_CALL_FUNCTION))
			generic_smp_call_function_interrupt();
		if (all & IPI_MESSAGE(PPC_MSG_RESCHEDULE))
			scheduler_ipi();
		if (all & IPI_MESSAGE(PPC_MSG_TICK_BROADCAST))
			tick_broadcast_ipi_handler();
#ifdef CONFIG_NMI_IPI
		if (all & IPI_MESSAGE(PPC_MSG_NMI_IPI))
			nmi_ipi_action(0, NULL);
#endif
	} while (info->messages);

	return IRQ_HANDLED;
}
Example #2
0
irqreturn_t smp_ipi_demux(void)
{
    struct cpu_messages *info = this_cpu_ptr(&ipi_message);
    unsigned int all;

    mb();	/* order any irq clear */

    do {
        all = xchg(&info->messages, 0);
        if (all & IPI_MESSAGE(PPC_MSG_CALL_FUNCTION))
            generic_smp_call_function_interrupt();
        if (all & IPI_MESSAGE(PPC_MSG_RESCHEDULE))
            scheduler_ipi();
        if (all & IPI_MESSAGE(PPC_MSG_TICK_BROADCAST))
            tick_broadcast_ipi_handler();
        if (all & IPI_MESSAGE(PPC_MSG_DEBUGGER_BREAK))
            debug_ipi_action(0, NULL);
    } while (info->messages);

    return IRQ_HANDLED;
}
Example #3
0
static irqreturn_t tick_broadcast_ipi_action(int irq, void *data)
{
	tick_broadcast_ipi_handler();
	return IRQ_HANDLED;
}