block: Remove bdrv_set_aio_context()

All callers of bdrv_set_aio_context() are eliminated now, they have
moved to bdrv_try_set_aio_context() and related safe functions. Remove
bdrv_set_aio_context().

With this, we can now know that the .set_aio_ctx callback must be
present in bdrv_set_aio_context_ignore() because
bdrv_can_set_aio_context() would have returned false previously, so
instead of checking the condition, we can assert it.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Kevin Wolf 2019-05-07 18:31:38 +02:00
parent 26bf15e441
commit 42a65f02f9
3 changed files with 16 additions and 27 deletions

30
block.c
View File

@ -5789,8 +5789,17 @@ static void bdrv_attach_aio_context(BlockDriverState *bs,
bs->walking_aio_notifiers = false; bs->walking_aio_notifiers = false;
} }
/* @ignore will accumulate all visited BdrvChild object. The caller is /*
* responsible for freeing the list afterwards. */ * Changes the AioContext used for fd handlers, timers, and BHs by this
* BlockDriverState and all its children and parents.
*
* 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).
*
* @ignore will accumulate all visited BdrvChild object. The caller is
* responsible for freeing the list afterwards.
*/
void bdrv_set_aio_context_ignore(BlockDriverState *bs, void bdrv_set_aio_context_ignore(BlockDriverState *bs,
AioContext *new_context, GSList **ignore) AioContext *new_context, GSList **ignore)
{ {
@ -5813,10 +5822,9 @@ void bdrv_set_aio_context_ignore(BlockDriverState *bs,
if (g_slist_find(*ignore, child)) { if (g_slist_find(*ignore, child)) {
continue; continue;
} }
if (child->role->set_aio_ctx) { assert(child->role->set_aio_ctx);
*ignore = g_slist_prepend(*ignore, child); *ignore = g_slist_prepend(*ignore, child);
child->role->set_aio_ctx(child, new_context, ignore); child->role->set_aio_ctx(child, new_context, ignore);
}
} }
bdrv_detach_aio_context(bs); bdrv_detach_aio_context(bs);
@ -5830,16 +5838,6 @@ void bdrv_set_aio_context_ignore(BlockDriverState *bs,
aio_context_release(new_context); aio_context_release(new_context);
} }
/* 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). */
void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
{
GSList *ignore_list = NULL;
bdrv_set_aio_context_ignore(bs, new_context, &ignore_list);
g_slist_free(ignore_list);
}
static bool bdrv_parent_can_set_aio_context(BdrvChild *c, AioContext *ctx, static bool bdrv_parent_can_set_aio_context(BdrvChild *c, AioContext *ctx,
GSList **ignore, Error **errp) GSList **ignore, Error **errp)
{ {

View File

@ -109,7 +109,7 @@ The AioContext originates from the QEMU block layer, even though nowadays
AioContext is a generic event loop that can be used by any QEMU subsystem. AioContext is a generic event loop that can be used by any QEMU subsystem.
The block layer has support for AioContext integrated. Each BlockDriverState The block layer has support for AioContext integrated. Each BlockDriverState
is associated with an AioContext using bdrv_set_aio_context() and is associated with an AioContext using bdrv_try_set_aio_context() and
bdrv_get_aio_context(). This allows block layer code to process I/O inside the bdrv_get_aio_context(). This allows block layer code to process I/O inside the
right AioContext. Other subsystems may wish to follow a similar approach. right AioContext. Other subsystems may wish to follow a similar approach.
@ -134,5 +134,5 @@ Long-running jobs (usually in the form of coroutines) are best scheduled in
the BlockDriverState's AioContext to avoid the need to acquire/release around the BlockDriverState's AioContext to avoid the need to acquire/release around
each bdrv_*() call. The functions bdrv_add/remove_aio_context_notifier, each bdrv_*() call. The functions bdrv_add/remove_aio_context_notifier,
or alternatively blk_add/remove_aio_context_notifier if you use BlockBackends, or alternatively blk_add/remove_aio_context_notifier if you use BlockBackends,
can be used to get a notification whenever bdrv_set_aio_context() moves a can be used to get a notification whenever bdrv_try_set_aio_context() moves a
BlockDriverState to a different AioContext. BlockDriverState to a different AioContext.

View File

@ -583,15 +583,6 @@ AioContext *bdrv_get_aio_context(BlockDriverState *bs);
*/ */
void bdrv_coroutine_enter(BlockDriverState *bs, Coroutine *co); void bdrv_coroutine_enter(BlockDriverState *bs, Coroutine *co);
/**
* bdrv_set_aio_context:
*
* Changes the #AioContext used for fd handlers, timers, and BHs by this
* BlockDriverState and all its children.
*
* This function must be called with iothread lock held.
*/
void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context);
void bdrv_set_aio_context_ignore(BlockDriverState *bs, void bdrv_set_aio_context_ignore(BlockDriverState *bs,
AioContext *new_context, GSList **ignore); AioContext *new_context, GSList **ignore);
int bdrv_try_set_aio_context(BlockDriverState *bs, AioContext *ctx, int bdrv_try_set_aio_context(BlockDriverState *bs, AioContext *ctx,