From 779a0e15ca0d9d5dbcbdee29b1dad9faf73bfc77 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Wed, 7 Dec 2016 11:13:05 -0800 Subject: [PATCH] xen/arm: fix smpboot barriers Remove useless smp_wmb() barrier after cpumask_set_cpu(cpuid, &cpu_online_map), which is not synchronizing against anything. Keep the other smp_wmb(), before the cpumask_set_cpu call, to ensure that all writes before setting the cpu online are visible to other cpus. For that to work properly, we need a corresponding smp_rmb() barrier, after reading the online cpumask from other processors, which is currently missing. Add it. See: http://marc.info/?l=xen-devel&m=148093236307211 Signed-off-by: Stefano Stabellini Reviewed-by: Julien Grall --- xen/arch/arm/smpboot.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c index 90ad1d0347..32e87221c0 100644 --- a/xen/arch/arm/smpboot.c +++ b/xen/arch/arm/smpboot.c @@ -307,11 +307,14 @@ void start_secondary(unsigned long boot_phys_offset, /* Run local notifiers */ notify_cpu_starting(cpuid); + /* + * Ensure that previous writes are visible before marking the cpu as + * online. + */ smp_wmb(); /* Now report this CPU is up */ cpumask_set_cpu(cpuid, &cpu_online_map); - smp_wmb(); local_irq_enable(); local_abort_enable(); @@ -408,6 +411,11 @@ int __cpu_up(unsigned int cpu) cpu_relax(); process_pending_softirqs(); } + /* + * Ensure that other cpus' initializations are visible before + * proceeding. Corresponds to smp_wmb() in start_secondary. + */ + smp_rmb(); /* * Nuke start of day info before checking one last time if the CPU -- 2.39.5