]> git.ipfire.org Git - thirdparty/libvirt.git/commit
qemu: Signal domain condition in qemuProcessStop a bit later
authorJiri Denemark <jdenemar@redhat.com>
Fri, 16 Jul 2021 13:52:50 +0000 (15:52 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 19 Jul 2021 13:49:16 +0000 (15:49 +0200)
commit364995ed5708b71f2cab09c0416a66013f0a283f
tree08b24e5f2b0fbc855a16c53ffa6f9dac87cc1a2d
parent370ac3d25c8fd8b07197f953a19a51dc5d09fbd1
qemu: Signal domain condition in qemuProcessStop a bit later

Signaling the condition before vm->def->id is reset to -1 is dangerous:
in case a waiting thread wakes up, it does not see anything interesting
(the domain is still marked as running) and just enters virDomainObjWait
where it waits forever because the condition will never be signalled
again.

Originally it was impossible to get into such situation because the vm
object was locked all the time between signaling the condition and
resetting vm->def->id, but after commit 860a999802 released in 6.8.0,
qemuDomainObjStopWorker called in qemuProcessStop between
virDomainObjBroadcast and setting vm->def->id to -1 unlocks the vm
object giving other threads a chance to wake up and possibly hang.

In real world, this can be easily reproduced by killing, destroying, or
just shutting down (from the guest OS) a domain while it is being
migrated somewhere else. The migration job would never finish.

So let's make sure we delay signaling the domain condition to the point
when a woken up thread can detect the domain is not active anymore.

https://bugzilla.redhat.com/show_bug.cgi?id=1949869

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_process.c