qemu/include/block
Paolo Bonzini aead9dc9d1 graph-lock: Introduce a lock to protect block graph operations
Block layer graph operations are always run under BQL in the main loop.
This is proved by the assertion qemu_in_main_thread() and its wrapper
macro GLOBAL_STATE_CODE.

However, there are also concurrent coroutines running in other iothreads
that always try to traverse the graph. Currently this is protected
(among various other things) by the AioContext lock, but once this is
removed, we need to make sure that reads do not happen while modifying
the graph.

We distinguish between writer (main loop, under BQL) that modifies the
graph, and readers (all other coroutines running in various AioContext),
that go through the graph edges, reading ->parents and->children.

The writer (main loop) has "exclusive" access, so it first waits for any
current read to finish, and then prevents incoming ones from entering
while it has the exclusive access.

The readers (coroutines in multiple AioContext) are free to access the
graph as long the writer is not modifying the graph. In case it is, they
go in a CoQueue and sleep until the writer is done.

If a coroutine changes AioContext, the counter in the original and new
AioContext are left intact, since the writer does not care where the
reader is, but only if there is one.

As a result, some AioContexts might have a negative reader count, to
balance the positive count of the AioContext that took the lock.  This
also means that when an AioContext is deleted it may have a nonzero
reader count. In that case we transfer the count to a global shared
counter so that the writer is always aware of all readers.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20221207131838.239125-3-kwolf@redhat.com>
Reviewed-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2022-12-15 16:07:43 +01:00
..
accounting.h block: pass OnOffAuto instead of bool to block_acct_setup() 2022-09-30 18:02:30 +02:00
aio-wait.h aio-wait.h: introduce AIO_WAIT_WHILE_UNLOCKED 2022-10-07 12:11:41 +02:00
aio.h graph-lock: Introduce a lock to protect block graph operations 2022-12-15 16:07:43 +01:00
aio_task.h block: introduce aio task pool 2019-10-10 10:56:17 +02:00
block-common.h block/dirty-bitmap: convert coroutine-only functions to co_wrapper 2022-12-15 16:07:43 +01:00
block-copy.h block-copy: add coroutine_fn annotations 2022-12-15 16:07:43 +01:00
block-global-state.h block: Factor out bdrv_drain_all_begin_nopoll() 2022-12-15 16:07:43 +01:00
block-hmp-cmds.h monitor: add missing coroutine_fn annotation 2022-10-27 20:14:11 +02:00
block-io.h block/dirty-bitmap: convert coroutine-only functions to co_wrapper 2022-12-15 16:07:43 +01:00
block.h include/block/block: split header into I/O and global state API 2022-03-04 18:18:25 +01:00
block_backup.h block/backup: drop unused synchronization interface 2018-12-14 11:52:40 +01:00
block_int-common.h block: Call drain callbacks only once 2022-12-15 16:07:42 +01:00
block_int-global-state.h Clean up decorations and whitespace around header guards 2022-05-11 16:50:32 +02:00
block_int-io.h block: Remove subtree drains 2022-12-15 16:07:42 +01:00
block_int.h graph-lock: Introduce a lock to protect block graph operations 2022-12-15 16:07:43 +01:00
blockjob.h blockjob: remove unused functions 2022-10-07 12:11:41 +02:00
blockjob_int.h include/block/blockjob_int.h: split header into I/O and GS API 2022-03-04 18:18:25 +01:00
dirty-bitmap.h block/dirty-bitmap: convert coroutine-only functions to co_wrapper 2022-12-15 16:07:43 +01:00
export.h block/export: Move blk to BlockExport 2020-10-02 15:46:40 +02:00
fuse.h fuse: Allow exporting BDSs via FUSE 2020-12-11 17:52:39 +01:00
graph-lock.h graph-lock: Introduce a lock to protect block graph operations 2022-12-15 16:07:43 +01:00
nbd.h nbd: remove incorrect coroutine_fn annotations 2022-10-07 12:11:40 +02:00
nvme.h nvme: Fix misleading macro when mixed with ternary operator 2022-07-15 10:40:33 +02:00
qapi.h qapi: Allow getting flat output from 'query-named-block-nodes' 2020-02-20 16:43:42 +01:00
qdict.h include: move qdict_{crumple,flatten} declarations 2022-04-21 17:03:51 +04:00
raw-aio.h linux-aio: add dev_max_batch parameter to laio_io_unplug() 2021-11-02 13:03:35 +01:00
replication.h replication: move include out of root directory 2021-05-26 14:49:46 +02:00
reqlist.h block/reqlist: add reqlist_wait_all() 2022-03-07 09:33:30 +01:00
snapshot.h include/block/snapshot: global state API + assertions 2022-03-04 18:18:25 +01:00
thread-pool.h util/event-loop-base: Introduce options to set the thread pool size 2022-05-09 10:43:23 +01:00
throttle-groups.h block/throttle-groups: throttle_group_co_io_limits_intercept(): 64bit bytes 2021-02-03 08:14:00 -06:00
write-threshold.h write-threshold: deal with includes 2021-05-14 16:14:10 +02:00