|
@@ -38,7 +38,7 @@ void doorbell_global_ipi(int cpu)
|
|
|
|
|
|
kvmppc_set_host_ipi(cpu, 1);
|
|
kvmppc_set_host_ipi(cpu, 1);
|
|
/* Order previous accesses vs. msgsnd, which is treated as a store */
|
|
/* Order previous accesses vs. msgsnd, which is treated as a store */
|
|
- mb();
|
|
|
|
|
|
+ ppc_msgsnd_sync();
|
|
ppc_msgsnd(PPC_DBELL_MSGTYPE, 0, tag);
|
|
ppc_msgsnd(PPC_DBELL_MSGTYPE, 0, tag);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -53,7 +53,7 @@ void doorbell_core_ipi(int cpu)
|
|
|
|
|
|
kvmppc_set_host_ipi(cpu, 1);
|
|
kvmppc_set_host_ipi(cpu, 1);
|
|
/* Order previous accesses vs. msgsnd, which is treated as a store */
|
|
/* Order previous accesses vs. msgsnd, which is treated as a store */
|
|
- mb();
|
|
|
|
|
|
+ ppc_msgsnd_sync();
|
|
ppc_msgsnd(PPC_DBELL_MSGTYPE, 0, tag);
|
|
ppc_msgsnd(PPC_DBELL_MSGTYPE, 0, tag);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -82,12 +82,14 @@ void doorbell_exception(struct pt_regs *regs)
|
|
|
|
|
|
irq_enter();
|
|
irq_enter();
|
|
|
|
|
|
|
|
+ ppc_msgsync();
|
|
|
|
+
|
|
may_hard_irq_enable();
|
|
may_hard_irq_enable();
|
|
|
|
|
|
kvmppc_set_host_ipi(smp_processor_id(), 0);
|
|
kvmppc_set_host_ipi(smp_processor_id(), 0);
|
|
__this_cpu_inc(irq_stat.doorbell_irqs);
|
|
__this_cpu_inc(irq_stat.doorbell_irqs);
|
|
|
|
|
|
- smp_ipi_demux();
|
|
|
|
|
|
+ smp_ipi_demux_relaxed(); /* already performed the barrier */
|
|
|
|
|
|
irq_exit();
|
|
irq_exit();
|
|
set_irq_regs(old_regs);
|
|
set_irq_regs(old_regs);
|