]> git.proxmox.com Git - mirror_qemu.git/commit - block/throttle.c
block: Convert bdrv_refresh_total_sectors() to co_wrapper_mixed
authorEmanuele Giuseppe Esposito <eesposit@redhat.com>
Fri, 13 Jan 2023 20:42:04 +0000 (21:42 +0100)
committerKevin Wolf <kwolf@redhat.com>
Wed, 1 Feb 2023 15:52:32 +0000 (16:52 +0100)
commitc86422c5549c0983b4b4525b8f56a1c69dd67aa1
tree9791a300734a7dda8422e6a531b2d0f592a10768
parentc057960c4e33becb22d4741156203a4b0d4a3088
block: Convert bdrv_refresh_total_sectors() to co_wrapper_mixed

BlockDriver->bdrv_getlength is categorized as IO callback, and it
currently doesn't run in a coroutine. We should let it take a graph
rdlock since the callback traverses the block nodes graph, which however
is only possible in a coroutine.

Therefore turn it into a co_wrapper to move the actual function into a
coroutine where the lock can be taken.

Because now this function creates a new coroutine and polls, we need to
take the AioContext lock where it is missing, for the only reason that
internally co_wrapper calls AIO_WAIT_WHILE and it expects to release the
AioContext lock.

This is especially messy when a co_wrapper creates a coroutine and polls
in bdrv_open_driver, because this function has so many callers in so
many context that it can easily lead to deadlocks. Therefore the new
rule for bdrv_open_driver is that the caller must always hold the
AioContext lock of the given bs (except if it is a coroutine), because
the function calls bdrv_refresh_total_sectors() which is now a
co_wrapper.

Once the rwlock is ultimated and placed in every place it needs to be,
we will poll using AIO_WAIT_WHILE_UNLOCKED and remove the AioContext
lock.

Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20230113204212.359076-7-kwolf@redhat.com>
Reviewed-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
35 files changed:
block.c
block/blkdebug.c
block/blkio.c
block/blklogwrites.c
block/blkreplay.c
block/blkverify.c
block/block-backend.c
block/commit.c
block/copy-on-read.c
block/crypto.c
block/curl.c
block/file-posix.c
block/file-win32.c
block/filter-compress.c
block/gluster.c
block/iscsi.c
block/meson.build
block/mirror.c
block/nbd.c
block/null.c
block/nvme.c
block/preallocate.c
block/qed.c
block/quorum.c
block/raw-format.c
block/rbd.c
block/replication.c
block/ssh.c
block/throttle.c
hw/scsi/scsi-disk.c
include/block/block-io.h
include/block/block_int-common.h
include/block/block_int-io.h
include/sysemu/block-backend-io.h
tests/unit/test-block-iothread.c