From: Julien Grall Date: Sat, 20 Feb 2021 19:22:34 +0000 (+0000) Subject: xen/sched: Add missing memory barrier in vcpu_block() X-Git-Tag: 4.15.0-rc3~48 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=109e8177fd4a225e7025c4c17d2c9537b550b4ed;p=people%2Ftklengyel%2Fxen.git xen/sched: Add missing memory barrier in vcpu_block() The comment in vcpu_block() states that the events should be checked /after/ blocking to avoids wakeup waiting race. However, from a generic perspective, set_bit() doesn't prevent re-ordering. So the following could happen: CPU0 (blocking vCPU A) |  CPU1 ( unblock vCPU A) | A <- read local events | | set local events | test_and_clear_bit(_VPF_blocked) | -> Bail out as the bit if not set | set_bit(_VFP_blocked) | | check A | The variable A will be 0 and therefore the vCPU will be blocked when it should continue running. vcpu_block() is now gaining an smp_mb__after_atomic() to prevent the CPU to read any information about local events before the flag _VPF_blocked is set. Signed-off-by: Julien Grall Reviewed-by: Jan Beulich Reviewed-by: Ash Wilding Acked-by: Stefano Stabellini Acked-by: Dario Faggioli Release-Acked-by: Ian Jackson --- diff --git a/xen/common/sched/core.c b/xen/common/sched/core.c index 9745a77eee..2b974fd6f8 100644 --- a/xen/common/sched/core.c +++ b/xen/common/sched/core.c @@ -1418,6 +1418,8 @@ void vcpu_block(void) set_bit(_VPF_blocked, &v->pause_flags); + smp_mb__after_atomic(); + arch_vcpu_block(v); /* Check for events /after/ blocking: avoids wakeup waiting race. */