From: Stefano Stabellini Date: Wed, 7 Dec 2016 19:13:05 +0000 (-0800) Subject: xen/arm: fix smpboot barriers X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~3239 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=779a0e15ca0d9d5dbcbdee29b1dad9faf73bfc77;p=xen.git 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 --- 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