mirror of https://github.com/xemu-project/xemu.git
block-backend: implement .change_aio_ctx in child_root
blk_root_change_aio_ctx() is very similar to blk_root_can_set_aio_ctx(), but implements a new transaction so that if all check pass, the new transaction's .commit will take care of changing the BlockBackend AioContext. blk_root_set_aio_ctx_commit() is the same as blk_root_set_aio_ctx(). Note: bdrv_child_try_change_aio_context() is not called by anyone at this point. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20221025084952.2139888-7-eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
27633e740e
commit
3394939621
|
@ -138,6 +138,9 @@ static bool blk_root_can_set_aio_ctx(BdrvChild *child, AioContext *ctx,
|
||||||
GSList **ignore, Error **errp);
|
GSList **ignore, Error **errp);
|
||||||
static void blk_root_set_aio_ctx(BdrvChild *child, AioContext *ctx,
|
static void blk_root_set_aio_ctx(BdrvChild *child, AioContext *ctx,
|
||||||
GSList **ignore);
|
GSList **ignore);
|
||||||
|
static bool blk_root_change_aio_ctx(BdrvChild *child, AioContext *ctx,
|
||||||
|
GHashTable *visited, Transaction *tran,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
static char *blk_root_get_parent_desc(BdrvChild *child)
|
static char *blk_root_get_parent_desc(BdrvChild *child)
|
||||||
{
|
{
|
||||||
|
@ -336,6 +339,7 @@ static const BdrvChildClass child_root = {
|
||||||
|
|
||||||
.can_set_aio_ctx = blk_root_can_set_aio_ctx,
|
.can_set_aio_ctx = blk_root_can_set_aio_ctx,
|
||||||
.set_aio_ctx = blk_root_set_aio_ctx,
|
.set_aio_ctx = blk_root_set_aio_ctx,
|
||||||
|
.change_aio_ctx = blk_root_change_aio_ctx,
|
||||||
|
|
||||||
.get_parent_aio_context = blk_root_get_parent_aio_context,
|
.get_parent_aio_context = blk_root_get_parent_aio_context,
|
||||||
};
|
};
|
||||||
|
@ -2177,6 +2181,54 @@ int blk_set_aio_context(BlockBackend *blk, AioContext *new_context,
|
||||||
return blk_do_set_aio_context(blk, new_context, true, errp);
|
return blk_do_set_aio_context(blk, new_context, true, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct BdrvStateBlkRootContext {
|
||||||
|
AioContext *new_ctx;
|
||||||
|
BlockBackend *blk;
|
||||||
|
} BdrvStateBlkRootContext;
|
||||||
|
|
||||||
|
static void blk_root_set_aio_ctx_commit(void *opaque)
|
||||||
|
{
|
||||||
|
BdrvStateBlkRootContext *s = opaque;
|
||||||
|
BlockBackend *blk = s->blk;
|
||||||
|
|
||||||
|
blk_do_set_aio_context(blk, s->new_ctx, false, &error_abort);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TransactionActionDrv set_blk_root_context = {
|
||||||
|
.commit = blk_root_set_aio_ctx_commit,
|
||||||
|
.clean = g_free,
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool blk_root_change_aio_ctx(BdrvChild *child, AioContext *ctx,
|
||||||
|
GHashTable *visited, Transaction *tran,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
BlockBackend *blk = child->opaque;
|
||||||
|
BdrvStateBlkRootContext *s;
|
||||||
|
|
||||||
|
if (!blk->allow_aio_context_change) {
|
||||||
|
/*
|
||||||
|
* Manually created BlockBackends (those with a name) that are not
|
||||||
|
* attached to anything can change their AioContext without updating
|
||||||
|
* their user; return an error for others.
|
||||||
|
*/
|
||||||
|
if (!blk->name || blk->dev) {
|
||||||
|
/* TODO Add BB name/QOM path */
|
||||||
|
error_setg(errp, "Cannot change iothread of active block backend");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s = g_new(BdrvStateBlkRootContext, 1);
|
||||||
|
*s = (BdrvStateBlkRootContext) {
|
||||||
|
.new_ctx = ctx,
|
||||||
|
.blk = blk,
|
||||||
|
};
|
||||||
|
|
||||||
|
tran_add(tran, &set_blk_root_context, s);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool blk_root_can_set_aio_ctx(BdrvChild *child, AioContext *ctx,
|
static bool blk_root_can_set_aio_ctx(BdrvChild *child, AioContext *ctx,
|
||||||
GSList **ignore, Error **errp)
|
GSList **ignore, Error **errp)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue