blkdebug: reschedule coroutine on the AioContext it is running on
Keep the coroutine on the same AioContext. Without this change, there would be a race between yielding the coroutine and reentering it. While the race cannot happen now, because the code only runs from a single AioContext, this will change with multiqueue support in the block layer. While doing the change, replace custom bottom half with aio_co_schedule. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 20170213135235.12274-10-pbonzini@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
a9d9235567
commit
e5c67ab552
|
@ -405,12 +405,6 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void error_callback_bh(void *opaque)
|
|
||||||
{
|
|
||||||
Coroutine *co = opaque;
|
|
||||||
qemu_coroutine_enter(co);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int inject_error(BlockDriverState *bs, BlkdebugRule *rule)
|
static int inject_error(BlockDriverState *bs, BlkdebugRule *rule)
|
||||||
{
|
{
|
||||||
BDRVBlkdebugState *s = bs->opaque;
|
BDRVBlkdebugState *s = bs->opaque;
|
||||||
|
@ -423,8 +417,7 @@ static int inject_error(BlockDriverState *bs, BlkdebugRule *rule)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!immediately) {
|
if (!immediately) {
|
||||||
aio_bh_schedule_oneshot(bdrv_get_aio_context(bs), error_callback_bh,
|
aio_co_schedule(qemu_get_current_aio_context(), qemu_coroutine_self());
|
||||||
qemu_coroutine_self());
|
|
||||||
qemu_coroutine_yield();
|
qemu_coroutine_yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue