[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 02/20] block: Consistently call bdrv_activate() outside corout
From: |
Kevin Wolf |
Subject: |
[PATCH v2 02/20] block: Consistently call bdrv_activate() outside coroutine |
Date: |
Thu, 4 May 2023 13:57:32 +0200 |
Migration code can call bdrv_activate() in coroutine context, whereas
other callers call it outside of coroutines. As it calls other code that
is not supposed to run in coroutines, standardise on running outside of
coroutines.
This adds a no_co_wrapper to switch to the main loop before calling
bdrv_activate().
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
include/block/block-global-state.h | 6 +++++-
block/block-backend.c | 10 +++++++++-
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/include/block/block-global-state.h
b/include/block/block-global-state.h
index 399200a9a3..2c312cc774 100644
--- a/include/block/block-global-state.h
+++ b/include/block/block-global-state.h
@@ -166,7 +166,11 @@ int bdrv_amend_options(BlockDriverState *bs_new, QemuOpts
*opts,
BlockDriverState *check_to_replace_node(BlockDriverState *parent_bs,
const char *node_name, Error **errp);
-int bdrv_activate(BlockDriverState *bs, Error **errp);
+int no_coroutine_fn bdrv_activate(BlockDriverState *bs, Error **errp);
+
+int coroutine_fn no_co_wrapper
+bdrv_co_activate(BlockDriverState *bs, Error **errp);
+
void bdrv_activate_all(Error **errp);
int bdrv_inactivate_all(void);
diff --git a/block/block-backend.c b/block/block-backend.c
index fc530ded6a..e37d55d3e9 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -2024,7 +2024,15 @@ void blk_activate(BlockBackend *blk, Error **errp)
return;
}
- bdrv_activate(bs, errp);
+ /*
+ * Migration code can call this function in coroutine context, so leave
+ * coroutine context if necessary.
+ */
+ if (qemu_in_coroutine()) {
+ bdrv_co_activate(bs, errp);
+ } else {
+ bdrv_activate(bs, errp);
+ }
}
bool coroutine_fn blk_co_is_inserted(BlockBackend *blk)
--
2.40.1
- [PATCH v2 00/20] Graph locking, part 3 (more block drivers), Kevin Wolf, 2023/05/04
- [PATCH v2 01/20] qcow2: Don't call bdrv_getlength() in coroutine_fns, Kevin Wolf, 2023/05/04
- [PATCH v2 02/20] block: Consistently call bdrv_activate() outside coroutine,
Kevin Wolf <=
- [PATCH v2 03/20] block: bdrv/blk_co_unref() for calls in coroutine context, Kevin Wolf, 2023/05/04
- [PATCH v2 04/20] block: Don't call no_coroutine_fns in qmp_block_resize(), Kevin Wolf, 2023/05/04
- [PATCH v2 05/20] test-bdrv-drain: Don't modify the graph in coroutines, Kevin Wolf, 2023/05/04
- [PATCH v2 06/20] graph-lock: Add GRAPH_UNLOCKED(_PTR), Kevin Wolf, 2023/05/04
- [PATCH v2 09/20] nbd: Remove nbd_co_flush() wrapper function, Kevin Wolf, 2023/05/04
- [PATCH v2 14/20] block: Mark bdrv_co_get_info() and callers GRAPH_RDLOCK, Kevin Wolf, 2023/05/04
- [PATCH v2 11/20] vhdx: Require GRAPH_RDLOCK for accessing a node's parent list, Kevin Wolf, 2023/05/04
- [PATCH v2 16/20] block: Mark BlockDriver callbacks for amend job GRAPH_RDLOCK, Kevin Wolf, 2023/05/04
- [PATCH v2 15/20] block: Mark bdrv_co_debug_event() GRAPH_RDLOCK, Kevin Wolf, 2023/05/04