Blame SOURCES/kvm-block-Use-normal-drain-for-bdrv_set_aio_context.patch

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