Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ca980dc authored by Paul Mackerras's avatar Paul Mackerras Committed by Benjamin Herrenschmidt
Browse files

powerpc: Avoid extra indirect function call in sending IPIs



On many platforms (including pSeries), smp_ops->message_pass is always
smp_muxed_ipi_message_pass.  This changes arch/powerpc/kernel/smp.c so
that if smp_ops->message_pass is NULL, it calls smp_muxed_ipi_message_pass
directly.

This means that a platform doesn't need to set both .message_pass and
.cause_ipi, only one of them.  It is a slight performance improvement
in that it gets rid of an indirect function call at the expense of a
predictable conditional branch.

Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 7ac87abb
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -238,15 +238,25 @@ irqreturn_t smp_ipi_demux(void)
}
#endif /* CONFIG_PPC_SMP_MUXED_IPI */

static inline void do_message_pass(int cpu, int msg)
{
	if (smp_ops->message_pass)
		smp_ops->message_pass(cpu, msg);
#ifdef CONFIG_PPC_SMP_MUXED_IPI
	else
		smp_muxed_ipi_message_pass(cpu, msg);
#endif
}

void smp_send_reschedule(int cpu)
{
	if (likely(smp_ops))
		smp_ops->message_pass(cpu, PPC_MSG_RESCHEDULE);
		do_message_pass(cpu, PPC_MSG_RESCHEDULE);
}

void arch_send_call_function_single_ipi(int cpu)
{
	smp_ops->message_pass(cpu, PPC_MSG_CALL_FUNC_SINGLE);
	do_message_pass(cpu, PPC_MSG_CALL_FUNC_SINGLE);
}

void arch_send_call_function_ipi_mask(const struct cpumask *mask)
@@ -254,7 +264,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
	unsigned int cpu;

	for_each_cpu(cpu, mask)
		smp_ops->message_pass(cpu, PPC_MSG_CALL_FUNCTION);
		do_message_pass(cpu, PPC_MSG_CALL_FUNCTION);
}

#if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
@@ -268,7 +278,7 @@ void smp_send_debugger_break(void)

	for_each_online_cpu(cpu)
		if (cpu != me)
			smp_ops->message_pass(cpu, PPC_MSG_DEBUGGER_BREAK);
			do_message_pass(cpu, PPC_MSG_DEBUGGER_BREAK);
}
#endif

+1 −1
Original line number Diff line number Diff line
@@ -236,7 +236,7 @@ void __init mpc85xx_smp_init(void)
	}

	if (cpu_has_feature(CPU_FTR_DBELL)) {
		smp_85xx_ops.message_pass = smp_muxed_ipi_message_pass;
		/* .message_pass defaults to smp_muxed_ipi_message_pass */
		smp_85xx_ops.cause_ipi = doorbell_cause_ipi;
	}

+1 −1
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ static void __devinit smp_iSeries_setup_cpu(int nr)
}

static struct smp_ops_t iSeries_smp_ops = {
	.message_pass = smp_muxed_ipi_message_pass,
	.message_pass = NULL,	/* Use smp_muxed_ipi_message_pass */
	.cause_ipi    = smp_iSeries_cause_ipi,
	.probe        = smp_iSeries_probe,
	.kick_cpu     = smp_iSeries_kick_cpu,
+1 −1
Original line number Diff line number Diff line
@@ -447,7 +447,7 @@ void __init smp_psurge_give_timebase(void)

/* PowerSurge-style Macs */
struct smp_ops_t psurge_smp_ops = {
	.message_pass	= smp_muxed_ipi_message_pass,
	.message_pass	= NULL,	/* Use smp_muxed_ipi_message_pass */
	.cause_ipi	= smp_psurge_cause_ipi,
	.probe		= smp_psurge_probe,
	.kick_cpu	= smp_psurge_kick_cpu,
+1 −1
Original line number Diff line number Diff line
@@ -207,7 +207,7 @@ static struct smp_ops_t pSeries_mpic_smp_ops = {
};

static struct smp_ops_t pSeries_xics_smp_ops = {
	.message_pass	= smp_muxed_ipi_message_pass,
	.message_pass	= NULL,	/* Use smp_muxed_ipi_message_pass */
	.cause_ipi	= NULL,	/* Filled at runtime by xics_smp_probe() */
	.probe		= xics_smp_probe,
	.kick_cpu	= smp_pSeries_kick_cpu,
Loading