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