forked from Minki/linux
kvm,x86: Fix apf_task_wake_one() wq serialization
During code inspection, the following potential race was seen: CPU0 CPU1 kvm_async_pf_task_wait apf_task_wake_one [L] swait_active(&n->wq) [S] prepare_to_swait(&n.wq) [L] if (!hlist_unhahed(&n.link)) schedule() [S] hlist_del_init(&n->link); Properly serialize swait_active() checks such that a wakeup is not missed. Signed-off-by: Davidlohr Bueso <dbueso@suse.de> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
cc1b46803a
commit
a0cff57bb2
@ -180,7 +180,7 @@ static void apf_task_wake_one(struct kvm_task_sleep_node *n)
|
|||||||
hlist_del_init(&n->link);
|
hlist_del_init(&n->link);
|
||||||
if (n->halted)
|
if (n->halted)
|
||||||
smp_send_reschedule(n->cpu);
|
smp_send_reschedule(n->cpu);
|
||||||
else if (swait_active(&n->wq))
|
else if (swq_has_sleeper(&n->wq))
|
||||||
swake_up(&n->wq);
|
swake_up(&n->wq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user