summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/smp.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-09-26 21:07:20 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-09-26 21:07:20 -0400
commit5905db5ca0ac9a6d5bfe87f86b87cd1bdec3755a (patch)
tree6edb13ed37d842ef0b70d072b94e4c78010f90cf /arch/powerpc/kernel/smp.c
parentc5aa1e554a20fb3542c62688ae46049c9225a965 (diff)
parent6f0f9b6b3fcfe5e156f20d4f804f0d505c750b3c (diff)
downloadop-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.c11
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)))
OpenPOWER on IntegriCloud