qemu-e2k/block
Hanna Reitz ace5a161ea block: Start/end drain on correct AioContext
bdrv_parent_drained_{begin,end}_single() are supposed to operate on the
parent, not on the child, so they should not attempt to get the context
to poll from the child but the parent instead.  BDRV_POLL_WHILE(c->bs)
does get the context from the child, so we should replace it with
AIO_WAIT_WHILE() on the parent's context instead.

This problem becomes apparent when bdrv_replace_child_noperm() invokes
bdrv_parent_drained_end_single() after removing a child from a subgraph
that is in an I/O thread.  By the time bdrv_parent_drained_end_single()
is called, child->bs is NULL, and so BDRV_POLL_WHILE(c->bs, ...) will
poll the main loop instead of the I/O thread; but anything that
bdrv_parent_drained_end_single_no_poll() may have scheduled is going to
want to run in the I/O thread, but because we poll the main loop, the
I/O thread is never unpaused, and nothing is run, resulting in a
deadlock.

Closes: https://gitlab.com/qemu-project/qemu/-/issues/1215
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20221107151321.211175-4-hreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2022-11-10 14:58:43 +01:00
..
export
monitor
accounting.c
aio_task.c
amend.c
backup.c
blkdebug.c
blkio.c
blklogwrites.c
blkreplay.c
blkverify.c
block-backend.c
block-copy.c
block-gen.h
block-ram-registrar.c
bochs.c
cloop.c
commit.c
copy-before-write.c
copy-before-write.h
copy-on-read.c
copy-on-read.h
coroutines.h
create.c
crypto.c
crypto.h
curl.c
dirty-bitmap.c
dmg-bz2.c
dmg-lzfse.c
dmg.c
dmg.h
file-posix.c
file-win32.c
filter-compress.c
gluster.c
io_uring.c
io.c block: Start/end drain on correct AioContext 2022-11-10 14:58:43 +01:00
iscsi-opts.c
iscsi.c
linux-aio.c
meson.build
mirror.c
nbd.c
nfs.c
null.c
nvme.c
parallels-ext.c
parallels.c
parallels.h
preallocate.c
progress_meter.c
qapi-sysemu.c
qapi.c
qcow2-bitmap.c
qcow2-cache.c
qcow2-cluster.c
qcow2-refcount.c
qcow2-snapshot.c
qcow2-threads.c
qcow2.c
qcow2.h
qcow.c
qed-check.c
qed-cluster.c
qed-l2-cache.c
qed-table.c
qed.c
qed.h
quorum.c
raw-format.c
rbd.c
replication.c
reqlist.c
snapshot-access.c
snapshot.c
ssh.c
stream.c
throttle-groups.c
throttle.c
trace-events
trace.h
vdi.c
vhdx-endian.c
vhdx-log.c
vhdx.c
vhdx.h
vmdk.c
vpc.c
vvfat.c
win32-aio.c
write-threshold.c