Commit aabf5910 authored by Fam Zheng's avatar Fam Zheng
Browse files

block: Quiesce old aio context during bdrv_set_aio_context



The fact that the bs->aio_context is changing can confuse the dataplane
iothread, because of the now fine granularity aio context lock.
bdrv_drain should rather be a bdrv_drained_begin/end pair, but since
bs->aio_context is changing, we can just use aio_disable_external and
bdrv_parent_drained_begin.

Reported-by: default avatarEd Swierk <eswierk@skyportsystems.com>
Signed-off-by: default avatarFam Zheng <famz@redhat.com>
Acked-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 14e9559f
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -4396,11 +4396,12 @@ void bdrv_attach_aio_context(BlockDriverState *bs,

void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
{
    AioContext *ctx;
    AioContext *ctx = bdrv_get_aio_context(bs);

    aio_disable_external(ctx);
    bdrv_parent_drained_begin(bs);
    bdrv_drain(bs); /* ensure there are no in-flight requests */

    ctx = bdrv_get_aio_context(bs);
    while (aio_poll(ctx, false)) {
        /* wait for all bottom halves to execute */
    }
@@ -4412,6 +4413,8 @@ void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context)
     */
    aio_context_acquire(new_context);
    bdrv_attach_aio_context(bs, new_context);
    bdrv_parent_drained_end(bs);
    aio_enable_external(ctx);
    aio_context_release(new_context);
}