d05ab380db
Draining recursively traverses the graph, therefore we need to make sure that also such accesses to the graph are protected by the graph rdlock. There are 3 different drain callers to consider: 1. drain in the main loop: no issue at all, rdlock is nop. 2. drain in an iothread: rdlock only works in main loop or coroutines, so disallow it. 3. drain in a coroutine (regardless of AioContext): the drain mechanism takes care of scheduling a BH in the bs->aio_context that will then take care of perform the actual draining. This is wrong, because as pointed in (2) if bs->aio_context is an iothread then rdlock won't work. Therefore change bdrv_co_yield_to_drain to schedule the BH in the main loop. Caller (2) also implies that we need to modify test-bdrv-drain.c to disallow draining in the iothreads. For some places, we know that they will hold the lock, but we don't have the GRAPH_RDLOCK annotations yet. In this case, add assume_graph_lock() with a FIXME comment. These places will be removed once everything is properly annotated. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-ID: <20230929145157.45443-6-kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> |
||
---|---|---|
.. | ||
check-block-qdict.c | ||
check-qdict.c | ||
check-qjson.c | ||
check-qlist.c | ||
check-qlit.c | ||
check-qnull.c | ||
check-qnum.c | ||
check-qobject.c | ||
check-qom-interface.c | ||
check-qom-proplist.c | ||
check-qstring.c | ||
crypto-tls-psk-helpers.c | ||
crypto-tls-psk-helpers.h | ||
crypto-tls-x509-helpers.c | ||
crypto-tls-x509-helpers.h | ||
io-channel-helpers.c | ||
io-channel-helpers.h | ||
iothread.c | ||
iothread.h | ||
meson.build | ||
pkix_asn1_tab.c | ||
ptimer-test-stubs.c | ||
ptimer-test.c | ||
ptimer-test.h | ||
rcutorture.c | ||
socket-helpers.c | ||
socket-helpers.h | ||
test-aio-multithread.c | ||
test-aio.c | ||
test-authz-list.c | ||
test-authz-listfile.c | ||
test-authz-pam.c | ||
test-authz-simple.c | ||
test-base64.c | ||
test-bdrv-drain.c | ||
test-bdrv-graph-mod.c | ||
test-bitcnt.c | ||
test-bitmap.c | ||
test-bitops.c | ||
test-block-backend.c | ||
test-block-iothread.c | ||
test-blockjob-txn.c | ||
test-blockjob.c | ||
test-bufferiszero.c | ||
test-char.c | ||
test-clone-visitor.c | ||
test-coroutine.c | ||
test-crypto-afsplit.c | ||
test-crypto-akcipher.c | ||
test-crypto-block.c | ||
test-crypto-cipher.c | ||
test-crypto-der.c | ||
test-crypto-hash.c | ||
test-crypto-hmac.c | ||
test-crypto-ivgen.c | ||
test-crypto-pbkdf.c | ||
test-crypto-secret.c | ||
test-crypto-tlscredsx509.c | ||
test-crypto-tlssession.c | ||
test-crypto-xts.c | ||
test-cutils.c | ||
test-div128.c | ||
test-error-report.c | ||
test-forward-visitor.c | ||
test-hbitmap.c | ||
test-image-locking.c | ||
test-int128.c | ||
test-interval-tree.c | ||
test-io-channel-buffer.c | ||
test-io-channel-command.c | ||
test-io-channel-file.c | ||
test-io-channel-null.c | ||
test-io-channel-socket.c | ||
test-io-channel-tls.c | ||
test-io-task.c | ||
test-iov.c | ||
test-keyval.c | ||
test-logging.c | ||
test-mul64.c | ||
test-nested-aio-poll.c | ||
test-opts-visitor.c | ||
test-qapi-util.c | ||
test-qdev-global-props.c | ||
test-qdist.c | ||
test-qemu-opts.c | ||
test-qga.c | ||
test-qgraph.c | ||
test-qht.c | ||
test-qmp-cmds.c | ||
test-qmp-event.c | ||
test-qobject-input-visitor.c | ||
test-qobject-output-visitor.c | ||
test-qtree.c | ||
test-rcu-list.c | ||
test-rcu-simpleq.c | ||
test-rcu-slist.c | ||
test-rcu-tailq.c | ||
test-replication.c | ||
test-seccomp.c | ||
test-shift128.c | ||
test-smp-parse.c | ||
test-string-input-visitor.c | ||
test-string-output-visitor.c | ||
test-thread-pool.c | ||
test-throttle.c | ||
test-timed-average.c | ||
test-util-filemonitor.c | ||
test-util-sockets.c | ||
test-uuid.c | ||
test-virtio-dmabuf.c | ||
test-visitor-serialization.c | ||
test-vmstate.c | ||
test-write-threshold.c | ||
test-x86-cpuid.c | ||
test-xbzrle.c | ||
test-xs-node.c | ||
test-yank.c |