diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-26 21:07:20 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-26 21:07:20 -0400 |
commit | 5905db5ca0ac9a6d5bfe87f86b87cd1bdec3755a (patch) | |
tree | 6edb13ed37d842ef0b70d072b94e4c78010f90cf /arch/powerpc/kernel/smp.c | |
parent | c5aa1e554a20fb3542c62688ae46049c9225a965 (diff) | |
parent | 6f0f9b6b3fcfe5e156f20d4f804f0d505c750b3c (diff) | |
download | op-kernel-dev-5905db5ca0ac9a6d5bfe87f86b87cd1bdec3755a.zip op-kernel-dev-5905db5ca0ac9a6d5bfe87f86b87cd1bdec3755a.tar.gz |
Merge remote branch 'origin' into for-next
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 0321007..8d4214a 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))) |