diff options
| author | 2012-09-07 09:48:59 +1000 | |
|---|---|---|
| committer | 2012-09-07 09:48:59 +1000 | |
| commit | fff34b3412b9401a76ba9d021db1bd91cb0e02b6 (patch) | |
| tree | 870ed2d1555004e7939d15b5099017aae61c97b8 /arch/powerpc/kernel/smp.c | |
| parent | powerpc/kprobes: Rename opcode_t in probes.h to ppc_opcode_t (diff) | |
| parent | powerpc: Don't use __put_user() in patch_instruction (diff) | |
| download | wireguard-linux-fff34b3412b9401a76ba9d021db1bd91cb0e02b6.tar.xz wireguard-linux-fff34b3412b9401a76ba9d021db1bd91cb0e02b6.zip | |
Merge branch 'merge' into next
Brings in various bug fixes from 3.6-rcX
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 0321007086f7..8d4214afc21d 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))) |
