diff options
Diffstat (limited to 'arch/powerpc/kernel/smp.c')
| -rw-r--r-- | arch/powerpc/kernel/smp.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 0321007086f..8d4214afc21 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c @@ -198,8 +198,15 @@ void smp_muxed_ipi_message_pass(int cpu, int msg)  	struct cpu_messages *info = &per_cpu(ipi_message, cpu);  	char *message = (char *)&info->messages; +	/* +	 * Order previous accesses before accesses in the IPI handler. +	 */ +	smp_mb();  	message[msg] = 1; -	mb(); +	/* +	 * cause_ipi functions are required to include a full barrier +	 * before doing whatever causes the IPI. +	 */  	smp_ops->cause_ipi(cpu, info->data);  } @@ -211,7 +218,7 @@ irqreturn_t smp_ipi_demux(void)  	mb();	/* order any irq clear */  	do { -		all = xchg_local(&info->messages, 0); +		all = xchg(&info->messages, 0);  #ifdef __BIG_ENDIAN  		if (all & (1 << (24 - 8 * PPC_MSG_CALL_FUNCTION)))  |