From 1d47b2827170416abf387add121a3871194ddc40 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Fri, 1 Mar 2019 14:27:47 +0100 Subject: [PATCH 5/9] block: Use normal drain for bdrv_set_aio_context() RH-Author: Kevin Wolf Message-id: <20190301142747.12251-6-kwolf@redhat.com> Patchwork-id: 84765 O-Subject: [RHEL-7.7 qemu-kvm-rhev PATCH 5/5] block: Use normal drain for bdrv_set_aio_context() Bugzilla: 1671173 RH-Acked-by: Stefan Hajnoczi RH-Acked-by: Paolo Bonzini RH-Acked-by: John Snow Now that bdrv_set_aio_context() works inside drained sections, it can also use the real drain function instead of open coding something similar. Signed-off-by: Kevin Wolf (cherry picked from commit d70d595429ecd9ac4917e53453dd8979db8e5ffd) RHEL: This conflicts because we didn't backport the removal of the polling loop. The conflict is resolved so that the polling loop moves to above the drain and any requests a BH would spawn would still be correctly drained afterwards. The changed order alone would have compensated for the virtio-blk bug and it potentially compensates for other bugs, too (we know of bugs in the NBD client at least), so leaving the polling loop in, with the new ordering, feels like the safe way for a downstream backport. Signed-off-by: Kevin Wolf Signed-off-by: Miroslav Rezanina --- block.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/block.c b/block.c index 7cd3651..c47e5b0 100644 --- a/block.c +++ b/block.c @@ -4995,18 +4995,18 @@ void bdrv_attach_aio_context(BlockDriverState *bs, bs->walking_aio_notifiers = false; } +/* 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) { AioContext *ctx = bdrv_get_aio_context(bs); - aio_disable_external(ctx); - bdrv_parent_drained_begin(bs, NULL, false); - bdrv_drain(bs); /* ensure there are no in-flight requests */ - while (aio_poll(ctx, false)) { /* wait for all bottom halves to execute */ } + bdrv_drained_begin(bs); bdrv_detach_aio_context(bs); /* This function executes in the old AioContext so acquire the new one in @@ -5014,8 +5014,7 @@ 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, NULL, false); - aio_enable_external(ctx); + bdrv_drained_end(bs); aio_context_release(new_context); } -- 1.8.3.1