block: remove outdated AioContext locking comments
The AioContext lock no longer exists. There is one noteworthy change: - * More specifically, these functions use BDRV_POLL_WHILE(bs), which - * requires the caller to be either in the main thread and hold - * the BlockdriverState (bs) AioContext lock, or directly in the - * home thread that runs the bs AioContext. Calling them from - * another thread in another AioContext would cause deadlocks. + * More specifically, these functions use BDRV_POLL_WHILE(bs), which requires + * the caller to be either in the main thread or directly in the home thread + * that runs the bs AioContext. Calling them from another thread in another + * AioContext would cause deadlocks. I am not sure whether deadlocks are still possible. Maybe they have just moved to the fine-grained locks that have replaced the AioContext. Since I am not sure if the deadlocks are gone, I have kept the substance unchanged and just removed mention of the AioContext. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-ID: <20231205182011.1976568-15-stefanha@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
e91083cd3f
commit
23c983c8f6
73
block.c
73
block.c
@ -1616,11 +1616,6 @@ out:
|
|||||||
g_free(gen_node_name);
|
g_free(gen_node_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The caller must always hold @bs AioContext lock, because this function calls
|
|
||||||
* bdrv_refresh_total_sectors() which polls when called from non-coroutine
|
|
||||||
* context.
|
|
||||||
*/
|
|
||||||
static int no_coroutine_fn GRAPH_UNLOCKED
|
static int no_coroutine_fn GRAPH_UNLOCKED
|
||||||
bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv, const char *node_name,
|
bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv, const char *node_name,
|
||||||
QDict *options, int open_flags, Error **errp)
|
QDict *options, int open_flags, Error **errp)
|
||||||
@ -2901,7 +2896,7 @@ uint64_t bdrv_qapi_perm_to_blk_perm(BlockPermission qapi_perm)
|
|||||||
* Replaces the node that a BdrvChild points to without updating permissions.
|
* Replaces the node that a BdrvChild points to without updating permissions.
|
||||||
*
|
*
|
||||||
* If @new_bs is non-NULL, the parent of @child must already be drained through
|
* If @new_bs is non-NULL, the parent of @child must already be drained through
|
||||||
* @child and the caller must hold the AioContext lock for @new_bs.
|
* @child.
|
||||||
*/
|
*/
|
||||||
static void GRAPH_WRLOCK
|
static void GRAPH_WRLOCK
|
||||||
bdrv_replace_child_noperm(BdrvChild *child, BlockDriverState *new_bs)
|
bdrv_replace_child_noperm(BdrvChild *child, BlockDriverState *new_bs)
|
||||||
@ -3041,9 +3036,8 @@ static TransactionActionDrv bdrv_attach_child_common_drv = {
|
|||||||
*
|
*
|
||||||
* Returns new created child.
|
* Returns new created child.
|
||||||
*
|
*
|
||||||
* The caller must hold the AioContext lock for @child_bs. Both @parent_bs and
|
* Both @parent_bs and @child_bs can move to a different AioContext in this
|
||||||
* @child_bs can move to a different AioContext in this function. Callers must
|
* function.
|
||||||
* make sure that their AioContext locking is still correct after this.
|
|
||||||
*/
|
*/
|
||||||
static BdrvChild * GRAPH_WRLOCK
|
static BdrvChild * GRAPH_WRLOCK
|
||||||
bdrv_attach_child_common(BlockDriverState *child_bs,
|
bdrv_attach_child_common(BlockDriverState *child_bs,
|
||||||
@ -3142,9 +3136,8 @@ bdrv_attach_child_common(BlockDriverState *child_bs,
|
|||||||
/*
|
/*
|
||||||
* Function doesn't update permissions, caller is responsible for this.
|
* Function doesn't update permissions, caller is responsible for this.
|
||||||
*
|
*
|
||||||
* The caller must hold the AioContext lock for @child_bs. Both @parent_bs and
|
* Both @parent_bs and @child_bs can move to a different AioContext in this
|
||||||
* @child_bs can move to a different AioContext in this function. Callers must
|
* function.
|
||||||
* make sure that their AioContext locking is still correct after this.
|
|
||||||
*
|
*
|
||||||
* After calling this function, the transaction @tran may only be completed
|
* After calling this function, the transaction @tran may only be completed
|
||||||
* while holding a writer lock for the graph.
|
* while holding a writer lock for the graph.
|
||||||
@ -3184,9 +3177,6 @@ bdrv_attach_child_noperm(BlockDriverState *parent_bs,
|
|||||||
*
|
*
|
||||||
* On failure NULL is returned, errp is set and the reference to
|
* On failure NULL is returned, errp is set and the reference to
|
||||||
* child_bs is also dropped.
|
* child_bs is also dropped.
|
||||||
*
|
|
||||||
* The caller must hold the AioContext lock @child_bs, but not that of @ctx
|
|
||||||
* (unless @child_bs is already in @ctx).
|
|
||||||
*/
|
*/
|
||||||
BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
|
BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
|
||||||
const char *child_name,
|
const char *child_name,
|
||||||
@ -3226,9 +3216,6 @@ out:
|
|||||||
*
|
*
|
||||||
* On failure NULL is returned, errp is set and the reference to
|
* On failure NULL is returned, errp is set and the reference to
|
||||||
* child_bs is also dropped.
|
* child_bs is also dropped.
|
||||||
*
|
|
||||||
* If @parent_bs and @child_bs are in different AioContexts, the caller must
|
|
||||||
* hold the AioContext lock for @child_bs, but not for @parent_bs.
|
|
||||||
*/
|
*/
|
||||||
BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
|
BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
|
||||||
BlockDriverState *child_bs,
|
BlockDriverState *child_bs,
|
||||||
@ -3418,9 +3405,8 @@ static BdrvChildRole bdrv_backing_role(BlockDriverState *bs)
|
|||||||
*
|
*
|
||||||
* Function doesn't update permissions, caller is responsible for this.
|
* Function doesn't update permissions, caller is responsible for this.
|
||||||
*
|
*
|
||||||
* The caller must hold the AioContext lock for @child_bs. Both @parent_bs and
|
* Both @parent_bs and @child_bs can move to a different AioContext in this
|
||||||
* @child_bs can move to a different AioContext in this function. Callers must
|
* function.
|
||||||
* make sure that their AioContext locking is still correct after this.
|
|
||||||
*
|
*
|
||||||
* After calling this function, the transaction @tran may only be completed
|
* After calling this function, the transaction @tran may only be completed
|
||||||
* while holding a writer lock for the graph.
|
* while holding a writer lock for the graph.
|
||||||
@ -3513,9 +3499,8 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The caller must hold the AioContext lock for @backing_hd. Both @bs and
|
* Both @bs and @backing_hd can move to a different AioContext in this
|
||||||
* @backing_hd can move to a different AioContext in this function. Callers must
|
* function.
|
||||||
* make sure that their AioContext locking is still correct after this.
|
|
||||||
*
|
*
|
||||||
* If a backing child is already present (i.e. we're detaching a node), that
|
* If a backing child is already present (i.e. we're detaching a node), that
|
||||||
* child node must be drained.
|
* child node must be drained.
|
||||||
@ -3574,8 +3559,6 @@ int bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
|
|||||||
* itself, all options starting with "${bdref_key}." are considered part of the
|
* itself, all options starting with "${bdref_key}." are considered part of the
|
||||||
* BlockdevRef.
|
* BlockdevRef.
|
||||||
*
|
*
|
||||||
* The caller must hold the main AioContext lock.
|
|
||||||
*
|
|
||||||
* TODO Can this be unified with bdrv_open_image()?
|
* TODO Can this be unified with bdrv_open_image()?
|
||||||
*/
|
*/
|
||||||
int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
|
int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
|
||||||
@ -3745,9 +3728,7 @@ done:
|
|||||||
*
|
*
|
||||||
* The BlockdevRef will be removed from the options QDict.
|
* The BlockdevRef will be removed from the options QDict.
|
||||||
*
|
*
|
||||||
* The caller must hold the lock of the main AioContext and no other AioContext.
|
* @parent can move to a different AioContext in this function.
|
||||||
* @parent can move to a different AioContext in this function. Callers must
|
|
||||||
* make sure that their AioContext locking is still correct after this.
|
|
||||||
*/
|
*/
|
||||||
BdrvChild *bdrv_open_child(const char *filename,
|
BdrvChild *bdrv_open_child(const char *filename,
|
||||||
QDict *options, const char *bdref_key,
|
QDict *options, const char *bdref_key,
|
||||||
@ -3778,9 +3759,7 @@ BdrvChild *bdrv_open_child(const char *filename,
|
|||||||
/*
|
/*
|
||||||
* Wrapper on bdrv_open_child() for most popular case: open primary child of bs.
|
* Wrapper on bdrv_open_child() for most popular case: open primary child of bs.
|
||||||
*
|
*
|
||||||
* The caller must hold the lock of the main AioContext and no other AioContext.
|
* @parent can move to a different AioContext in this function.
|
||||||
* @parent can move to a different AioContext in this function. Callers must
|
|
||||||
* make sure that their AioContext locking is still correct after this.
|
|
||||||
*/
|
*/
|
||||||
int bdrv_open_file_child(const char *filename,
|
int bdrv_open_file_child(const char *filename,
|
||||||
QDict *options, const char *bdref_key,
|
QDict *options, const char *bdref_key,
|
||||||
@ -3923,8 +3902,6 @@ out:
|
|||||||
* The reference parameter may be used to specify an existing block device which
|
* The reference parameter may be used to specify an existing block device which
|
||||||
* should be opened. If specified, neither options nor a filename may be given,
|
* should be opened. If specified, neither options nor a filename may be given,
|
||||||
* nor can an existing BDS be reused (that is, *pbs has to be NULL).
|
* nor can an existing BDS be reused (that is, *pbs has to be NULL).
|
||||||
*
|
|
||||||
* The caller must always hold the main AioContext lock.
|
|
||||||
*/
|
*/
|
||||||
static BlockDriverState * no_coroutine_fn
|
static BlockDriverState * no_coroutine_fn
|
||||||
bdrv_open_inherit(const char *filename, const char *reference, QDict *options,
|
bdrv_open_inherit(const char *filename, const char *reference, QDict *options,
|
||||||
@ -4217,7 +4194,6 @@ close_and_fail:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The caller must always hold the main AioContext lock. */
|
|
||||||
BlockDriverState *bdrv_open(const char *filename, const char *reference,
|
BlockDriverState *bdrv_open(const char *filename, const char *reference,
|
||||||
QDict *options, int flags, Error **errp)
|
QDict *options, int flags, Error **errp)
|
||||||
{
|
{
|
||||||
@ -4665,10 +4641,7 @@ int bdrv_reopen_set_read_only(BlockDriverState *bs, bool read_only,
|
|||||||
*
|
*
|
||||||
* Return 0 on success, otherwise return < 0 and set @errp.
|
* Return 0 on success, otherwise return < 0 and set @errp.
|
||||||
*
|
*
|
||||||
* The caller must hold the AioContext lock of @reopen_state->bs.
|
|
||||||
* @reopen_state->bs can move to a different AioContext in this function.
|
* @reopen_state->bs can move to a different AioContext in this function.
|
||||||
* Callers must make sure that their AioContext locking is still correct after
|
|
||||||
* this.
|
|
||||||
*/
|
*/
|
||||||
static int GRAPH_UNLOCKED
|
static int GRAPH_UNLOCKED
|
||||||
bdrv_reopen_parse_file_or_backing(BDRVReopenState *reopen_state,
|
bdrv_reopen_parse_file_or_backing(BDRVReopenState *reopen_state,
|
||||||
@ -4801,8 +4774,6 @@ out_rdlock:
|
|||||||
* It is the responsibility of the caller to then call the abort() or
|
* It is the responsibility of the caller to then call the abort() or
|
||||||
* commit() for any other BDS that have been left in a prepare() state
|
* commit() for any other BDS that have been left in a prepare() state
|
||||||
*
|
*
|
||||||
* The caller must hold the AioContext lock of @reopen_state->bs.
|
|
||||||
*
|
|
||||||
* After calling this function, the transaction @change_child_tran may only be
|
* After calling this function, the transaction @change_child_tran may only be
|
||||||
* completed while holding a writer lock for the graph.
|
* completed while holding a writer lock for the graph.
|
||||||
*/
|
*/
|
||||||
@ -5437,8 +5408,6 @@ int bdrv_drop_filter(BlockDriverState *bs, Error **errp)
|
|||||||
* child.
|
* child.
|
||||||
*
|
*
|
||||||
* This function does not create any image files.
|
* This function does not create any image files.
|
||||||
*
|
|
||||||
* The caller must hold the AioContext lock for @bs_top.
|
|
||||||
*/
|
*/
|
||||||
int bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
|
int bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
@ -5545,9 +5514,8 @@ static void bdrv_delete(BlockDriverState *bs)
|
|||||||
* after the call (even on failure), so if the caller intends to reuse the
|
* after the call (even on failure), so if the caller intends to reuse the
|
||||||
* dictionary, it needs to use qobject_ref() before calling bdrv_open.
|
* dictionary, it needs to use qobject_ref() before calling bdrv_open.
|
||||||
*
|
*
|
||||||
* The caller holds the AioContext lock for @bs. It must make sure that @bs
|
* The caller must make sure that @bs stays in the same AioContext, i.e.
|
||||||
* stays in the same AioContext, i.e. @options must not refer to nodes in a
|
* @options must not refer to nodes in a different AioContext.
|
||||||
* different AioContext.
|
|
||||||
*/
|
*/
|
||||||
BlockDriverState *bdrv_insert_node(BlockDriverState *bs, QDict *options,
|
BlockDriverState *bdrv_insert_node(BlockDriverState *bs, QDict *options,
|
||||||
int flags, Error **errp)
|
int flags, Error **errp)
|
||||||
@ -7565,10 +7533,6 @@ static TransactionActionDrv set_aio_context = {
|
|||||||
*
|
*
|
||||||
* Must be called from the main AioContext.
|
* Must be called from the main AioContext.
|
||||||
*
|
*
|
||||||
* The caller must own the AioContext lock for the old AioContext of bs, but it
|
|
||||||
* must not own the AioContext lock for new_context (unless new_context is the
|
|
||||||
* same as the current context of bs).
|
|
||||||
*
|
|
||||||
* @visited will accumulate all visited BdrvChild objects. The caller is
|
* @visited will accumulate all visited BdrvChild objects. The caller is
|
||||||
* responsible for freeing the list afterwards.
|
* responsible for freeing the list afterwards.
|
||||||
*/
|
*/
|
||||||
@ -7621,13 +7585,6 @@ static bool bdrv_change_aio_context(BlockDriverState *bs, AioContext *ctx,
|
|||||||
*
|
*
|
||||||
* If ignore_child is not NULL, that child (and its subgraph) will not
|
* If ignore_child is not NULL, that child (and its subgraph) will not
|
||||||
* be touched.
|
* be touched.
|
||||||
*
|
|
||||||
* This function still requires the caller to take the bs current
|
|
||||||
* AioContext lock, otherwise draining will fail since AIO_WAIT_WHILE
|
|
||||||
* assumes the lock is always held if bs is in another AioContext.
|
|
||||||
* For the same reason, it temporarily also holds the new AioContext, since
|
|
||||||
* bdrv_drained_end calls BDRV_POLL_WHILE that assumes the lock is taken too.
|
|
||||||
* Therefore the new AioContext lock must not be taken by the caller.
|
|
||||||
*/
|
*/
|
||||||
int bdrv_try_change_aio_context(BlockDriverState *bs, AioContext *ctx,
|
int bdrv_try_change_aio_context(BlockDriverState *bs, AioContext *ctx,
|
||||||
BdrvChild *ignore_child, Error **errp)
|
BdrvChild *ignore_child, Error **errp)
|
||||||
@ -7653,8 +7610,8 @@ int bdrv_try_change_aio_context(BlockDriverState *bs, AioContext *ctx,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Linear phase: go through all callbacks collected in the transaction.
|
* Linear phase: go through all callbacks collected in the transaction.
|
||||||
* Run all callbacks collected in the recursion to switch all nodes
|
* Run all callbacks collected in the recursion to switch every node's
|
||||||
* AioContext lock (transaction commit), or undo all changes done in the
|
* AioContext (transaction commit), or undo all changes done in the
|
||||||
* recursion (transaction abort).
|
* recursion (transaction abort).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -390,8 +390,6 @@ BlockBackend *blk_new(AioContext *ctx, uint64_t perm, uint64_t shared_perm)
|
|||||||
* Both sets of permissions can be changed later using blk_set_perm().
|
* Both sets of permissions can be changed later using blk_set_perm().
|
||||||
*
|
*
|
||||||
* Return the new BlockBackend on success, null on failure.
|
* Return the new BlockBackend on success, null on failure.
|
||||||
*
|
|
||||||
* Callers must hold the AioContext lock of @bs.
|
|
||||||
*/
|
*/
|
||||||
BlockBackend *blk_new_with_bs(BlockDriverState *bs, uint64_t perm,
|
BlockBackend *blk_new_with_bs(BlockDriverState *bs, uint64_t perm,
|
||||||
uint64_t shared_perm, Error **errp)
|
uint64_t shared_perm, Error **errp)
|
||||||
@ -416,8 +414,6 @@ BlockBackend *blk_new_with_bs(BlockDriverState *bs, uint64_t perm,
|
|||||||
* Just as with bdrv_open(), after having called this function the reference to
|
* Just as with bdrv_open(), after having called this function the reference to
|
||||||
* @options belongs to the block layer (even on failure).
|
* @options belongs to the block layer (even on failure).
|
||||||
*
|
*
|
||||||
* Called without holding an AioContext lock.
|
|
||||||
*
|
|
||||||
* TODO: Remove @filename and @flags; it should be possible to specify a whole
|
* TODO: Remove @filename and @flags; it should be possible to specify a whole
|
||||||
* BDS tree just by specifying the @options QDict (or @reference,
|
* BDS tree just by specifying the @options QDict (or @reference,
|
||||||
* alternatively). At the time of adding this function, this is not possible,
|
* alternatively). At the time of adding this function, this is not possible,
|
||||||
@ -872,8 +868,6 @@ BlockBackend *blk_by_public(BlockBackendPublic *public)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Disassociates the currently associated BlockDriverState from @blk.
|
* Disassociates the currently associated BlockDriverState from @blk.
|
||||||
*
|
|
||||||
* The caller must hold the AioContext lock for the BlockBackend.
|
|
||||||
*/
|
*/
|
||||||
void blk_remove_bs(BlockBackend *blk)
|
void blk_remove_bs(BlockBackend *blk)
|
||||||
{
|
{
|
||||||
@ -915,8 +909,6 @@ void blk_remove_bs(BlockBackend *blk)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Associates a new BlockDriverState with @blk.
|
* Associates a new BlockDriverState with @blk.
|
||||||
*
|
|
||||||
* Callers must hold the AioContext lock of @bs.
|
|
||||||
*/
|
*/
|
||||||
int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp)
|
int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp)
|
||||||
{
|
{
|
||||||
|
@ -278,7 +278,6 @@ static void vu_blk_exp_resize(void *opaque)
|
|||||||
vu_config_change_msg(&vexp->vu_server.vu_dev);
|
vu_config_change_msg(&vexp->vu_server.vu_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called with vexp->export.ctx acquired */
|
|
||||||
static void vu_blk_drained_begin(void *opaque)
|
static void vu_blk_drained_begin(void *opaque)
|
||||||
{
|
{
|
||||||
VuBlkExport *vexp = opaque;
|
VuBlkExport *vexp = opaque;
|
||||||
@ -287,7 +286,6 @@ static void vu_blk_drained_begin(void *opaque)
|
|||||||
vhost_user_server_detach_aio_context(&vexp->vu_server);
|
vhost_user_server_detach_aio_context(&vexp->vu_server);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called with vexp->export.blk AioContext acquired */
|
|
||||||
static void vu_blk_drained_end(void *opaque)
|
static void vu_blk_drained_end(void *opaque)
|
||||||
{
|
{
|
||||||
VuBlkExport *vexp = opaque;
|
VuBlkExport *vexp = opaque;
|
||||||
@ -300,8 +298,6 @@ static void vu_blk_drained_end(void *opaque)
|
|||||||
* Ensures that bdrv_drained_begin() waits until in-flight requests complete
|
* Ensures that bdrv_drained_begin() waits until in-flight requests complete
|
||||||
* and the server->co_trip coroutine has terminated. It will be restarted in
|
* and the server->co_trip coroutine has terminated. It will be restarted in
|
||||||
* vhost_user_server_attach_aio_context().
|
* vhost_user_server_attach_aio_context().
|
||||||
*
|
|
||||||
* Called with vexp->export.ctx acquired.
|
|
||||||
*/
|
*/
|
||||||
static bool vu_blk_drained_poll(void *opaque)
|
static bool vu_blk_drained_poll(void *opaque)
|
||||||
{
|
{
|
||||||
|
@ -70,9 +70,6 @@
|
|||||||
* automatically takes the graph rdlock when calling the wrapped function. In
|
* automatically takes the graph rdlock when calling the wrapped function. In
|
||||||
* the same way, no_co_wrapper_bdrv_wrlock functions automatically take the
|
* the same way, no_co_wrapper_bdrv_wrlock functions automatically take the
|
||||||
* graph wrlock.
|
* graph wrlock.
|
||||||
*
|
|
||||||
* If the first parameter of the function is a BlockDriverState, BdrvChild or
|
|
||||||
* BlockBackend pointer, the AioContext lock for it is taken in the wrapper.
|
|
||||||
*/
|
*/
|
||||||
#define no_co_wrapper
|
#define no_co_wrapper
|
||||||
#define no_co_wrapper_bdrv_rdlock
|
#define no_co_wrapper_bdrv_rdlock
|
||||||
|
@ -332,11 +332,10 @@ bdrv_co_copy_range(BdrvChild *src, int64_t src_offset,
|
|||||||
* "I/O or GS" API functions. These functions can run without
|
* "I/O or GS" API functions. These functions can run without
|
||||||
* the BQL, but only in one specific iothread/main loop.
|
* the BQL, but only in one specific iothread/main loop.
|
||||||
*
|
*
|
||||||
* More specifically, these functions use BDRV_POLL_WHILE(bs), which
|
* More specifically, these functions use BDRV_POLL_WHILE(bs), which requires
|
||||||
* requires the caller to be either in the main thread and hold
|
* the caller to be either in the main thread or directly in the home thread
|
||||||
* the BlockdriverState (bs) AioContext lock, or directly in the
|
* that runs the bs AioContext. Calling them from another thread in another
|
||||||
* home thread that runs the bs AioContext. Calling them from
|
* AioContext would cause deadlocks.
|
||||||
* another thread in another AioContext would cause deadlocks.
|
|
||||||
*
|
*
|
||||||
* Therefore, these functions are not proper I/O, because they
|
* Therefore, these functions are not proper I/O, because they
|
||||||
* can't run in *any* iothreads, but only in a specific one.
|
* can't run in *any* iothreads, but only in a specific one.
|
||||||
|
@ -1192,8 +1192,6 @@ struct BlockDriverState {
|
|||||||
/* The error object in use for blocking operations on backing_hd */
|
/* The error object in use for blocking operations on backing_hd */
|
||||||
Error *backing_blocker;
|
Error *backing_blocker;
|
||||||
|
|
||||||
/* Protected by AioContext lock */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are reading a disk image, give its size in sectors.
|
* If we are reading a disk image, give its size in sectors.
|
||||||
* Generally read-only; it is written to by load_snapshot and
|
* Generally read-only; it is written to by load_snapshot and
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
# Check that QMP 'transaction' blockdev-snapshot-sync with multiple drives on a
|
# Check that QMP 'transaction' blockdev-snapshot-sync with multiple drives on a
|
||||||
# single IOThread completes successfully. This particular command triggered a
|
# single IOThread completes successfully. This particular command triggered a
|
||||||
# hang due to recursive AioContext locking and BDRV_POLL_WHILE(). Protect
|
# hang due to recursive AioContext locking and BDRV_POLL_WHILE(). Protect
|
||||||
# against regressions.
|
# against regressions even though the AioContext lock no longer exists.
|
||||||
|
|
||||||
import iotests
|
import iotests
|
||||||
|
|
||||||
|
@ -21,7 +21,8 @@
|
|||||||
# Check that QMP 'migrate' with multiple drives on a single IOThread completes
|
# Check that QMP 'migrate' with multiple drives on a single IOThread completes
|
||||||
# successfully. This particular command triggered a hang in the source QEMU
|
# successfully. This particular command triggered a hang in the source QEMU
|
||||||
# process due to recursive AioContext locking in bdrv_invalidate_all() and
|
# process due to recursive AioContext locking in bdrv_invalidate_all() and
|
||||||
# BDRV_POLL_WHILE().
|
# BDRV_POLL_WHILE(). Protect against regressions even though the AioContext
|
||||||
|
# lock no longer exists.
|
||||||
|
|
||||||
import iotests
|
import iotests
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user