qemu-e2k/include/block
Emanuele Giuseppe Esposito e6d3f7a602 block-coroutine-wrapper.py: introduce annotations that take the graph rdlock
Add co_wrapper_bdrv_rdlock and co_wrapper_mixed_bdrv_rdlock option to
the block-coroutine-wrapper.py script.

This "_bdrv_rdlock" option takes and releases the graph rdlock when a
coroutine function is created.

This means that when used together with "_mixed", the function marked
with co_wrapper_mixed_bdrv_rdlock will support both coroutine and
non-coroutine case, and in the latter case it will create a coroutine
that takes and releases the rdlock. When called from a coroutine, the
caller must already hold the graph lock.

Example:
void co_wrapper_mixed_bdrv_rdlock bdrv_f1();

Becomes

static void bdrv_co_enter_f1()
{
    bdrv_graph_co_rdlock();
    bdrv_co_function();
    bdrv_graph_co_rdunlock();
}

void bdrv_f1()
{
    if (qemu_in_coroutine) {
        assume_graph_lock();
        bdrv_co_function();
    } else {
        qemu_co_enter(bdrv_co_enter_f1);
        ...
    }
}

When used alone, the function will not work in coroutine context, and
when called in non-coroutine context it will create a new coroutine that
takes care of taking and releasing the rdlock automatically.

Example:
void co_wrapper_bdrv_rdlock bdrv_f1();

Becomes

static void bdrv_co_enter_f1()
{
    bdrv_graph_co_rdlock();
    bdrv_co_function();
    bdrv_graph_co_rdunlock();
}

void bdrv_f1()
{
    assert(!qemu_in_coroutine());
    qemu_co_enter(bdrv_co_enter_f1);
    ...
}

About their usage:
- co_wrapper does not take the rdlock, so it can be used also outside
  the block layer.
- co_wrapper_mixed will be used by many blk_* functions, since the
  coroutine function needs to call blk_wait_while_drained() and
  the rdlock *must* be taken afterwards, otherwise it's a deadlock.
  In the future this annotation will go away, and blk_* will use
  co_wrapper directly.
- co_wrapper_bdrv_rdlock will be used by BlockDriver callbacks, ideally
  by all of them in the future.
- co_wrapper_mixed_bdrv_rdlock will be used by the remaining functions
  that are still called by coroutine and non-coroutine context. In the
  future this annotation will go away, as we will split such mixed
  functions.

Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20221207131838.239125-17-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:08:23 +01:00
..
accounting.h block: pass OnOffAuto instead of bool to block_acct_setup() 2022-09-30 18:02:30 +02:00
aio_task.h
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
block_backup.h
block_int-common.h Mark assert_bdrv_graph_readable/writable() GRAPH_RD/WRLOCK 2022-12-15 16:08:23 +01:00
block_int-global-state.h block: assert that graph read and writes are performed correctly 2022-12-15 16:08:23 +01: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
block-common.h block-coroutine-wrapper.py: introduce annotations that take the graph rdlock 2022-12-15 16:08:23 +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
blockjob_int.h
blockjob.h blockjob: remove unused functions 2022-10-07 12:11:41 +02:00
dirty-bitmap.h block/dirty-bitmap: convert coroutine-only functions to co_wrapper 2022-12-15 16:07:43 +01:00
export.h
fuse.h
graph-lock.h Mark assert_bdrv_graph_readable/writable() GRAPH_RD/WRLOCK 2022-12-15 16:08:23 +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
qdict.h include: move qdict_{crumple,flatten} declarations 2022-04-21 17:03:51 +04:00
raw-aio.h
replication.h
reqlist.h block/reqlist: add reqlist_wait_all() 2022-03-07 09:33:30 +01:00
snapshot.h
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
write-threshold.h