[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] xen/sched: Add missing memory barrier in vcpu_block()
commit 109e8177fd4a225e7025c4c17d2c9537b550b4ed Author: Julien Grall <jgrall@xxxxxxxxxx> AuthorDate: Sat Feb 20 19:22:34 2021 +0000 Commit: Julien Grall <jgrall@xxxxxxxxxx> CommitDate: Fri Feb 26 09:47:23 2021 +0000 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 <jgrall@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Ash Wilding <ash.j.wilding@xxxxxxxxx> Acked-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> Acked-by: Dario Faggioli <dfaggioli@xxxxxxxx> Release-Acked-by: Ian Jackson <iwj@xxxxxxxxxxxxxx> --- xen/common/sched/core.c | 2 ++ 1 file changed, 2 insertions(+) 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. */ -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |