qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes
@ 2016-05-23 16:55 Kevin Wolf
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 1/4] block: Introduce bdrv_replace_child() Kevin Wolf
                   ` (5 more replies)
  0 siblings, 6 replies; 11+ messages in thread
From: Kevin Wolf @ 2016-05-23 16:55 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, stefanha, pbonzini, famz, qemu-devel

While working on the series that converts block jobs to using a separate
BlockBackend, I noticed that I need to do some drain fixes first. So here they
are.

Patches 1 and 2 are just preparation, patches 3 and 4 are the actual fixes.

Kevin Wolf (4):
  block: Introduce bdrv_replace_child()
  block: Make bdrv_drain() use bdrv_drained_begin/end()
  block: Fix reconfiguring graph with drained nodes
  block: Propagate .drained_begin/end callbacks

 block.c                   | 58 +++++++++++++++++++++++++++++++++------
 block/block-backend.c     |  9 ++++---
 block/io.c                | 69 +++++++++++++++++++++++------------------------
 include/block/block_int.h |  3 ++-
 4 files changed, 90 insertions(+), 49 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH 1/4] block: Introduce bdrv_replace_child()
  2016-05-23 16:55 [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes Kevin Wolf
@ 2016-05-23 16:55 ` Kevin Wolf
  2016-05-23 20:02   ` Eric Blake
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 2/4] block: Make bdrv_drain() use bdrv_drained_begin/end() Kevin Wolf
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Kevin Wolf @ 2016-05-23 16:55 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, stefanha, pbonzini, famz, qemu-devel

This adds a common function that is called when attaching a new child to
a parent, removing a child from a parent and when reconfiguring the
graph so that an existing child points to a different node now.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/block.c b/block.c
index 38df365..351344e 100644
--- a/block.c
+++ b/block.c
@@ -1150,18 +1150,32 @@ static int bdrv_fill_options(QDict **options, const char *filename,
     return 0;
 }
 
+static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs)
+{
+    BlockDriverState *old_bs = child->bs;
+
+    if (old_bs) {
+        QLIST_REMOVE(child, next_parent);
+    }
+    if (new_bs) {
+        QLIST_INSERT_HEAD(&new_bs->parents, child, next_parent);
+    }
+
+    child->bs = new_bs;
+}
+
 BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
                                   const char *child_name,
                                   const BdrvChildRole *child_role)
 {
     BdrvChild *child = g_new(BdrvChild, 1);
     *child = (BdrvChild) {
-        .bs     = child_bs,
+        .bs     = NULL,
         .name   = g_strdup(child_name),
         .role   = child_role,
     };
 
-    QLIST_INSERT_HEAD(&child_bs->parents, child, next_parent);
+    bdrv_replace_child(child, child_bs);
 
     return child;
 }
@@ -1182,7 +1196,9 @@ static void bdrv_detach_child(BdrvChild *child)
         QLIST_REMOVE(child, next);
         child->next.le_prev = NULL;
     }
-    QLIST_REMOVE(child, next_parent);
+
+    bdrv_replace_child(child, NULL);
+
     g_free(child->name);
     g_free(child);
 }
@@ -2203,10 +2219,8 @@ static void change_parent_backing_link(BlockDriverState *from,
 
     QLIST_FOREACH_SAFE(c, &from->parents, next_parent, next) {
         assert(c->role != &child_backing);
-        c->bs = to;
-        QLIST_REMOVE(c, next_parent);
-        QLIST_INSERT_HEAD(&to->parents, c, next_parent);
         bdrv_ref(to);
+        bdrv_replace_child(c, to);
         bdrv_unref(from);
     }
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH 2/4] block: Make bdrv_drain() use bdrv_drained_begin/end()
  2016-05-23 16:55 [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes Kevin Wolf
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 1/4] block: Introduce bdrv_replace_child() Kevin Wolf
@ 2016-05-23 16:55 ` Kevin Wolf
  2016-05-23 21:10   ` Eric Blake
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 3/4] block: Fix reconfiguring graph with drained nodes Kevin Wolf
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Kevin Wolf @ 2016-05-23 16:55 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, stefanha, pbonzini, famz, qemu-devel

Until now, bdrv_drained_begin() used bdrv_drain() internally to drain
the queue. This is kind of backwards and caused quiescing code to be
duplicated because bdrv_drained_begin() had to ensure that no new
requests come in even after bdrv_drain() returns, whereas bdrv_drain()
had to have them because it could be called from other places.

Instead move the bdrv_drain() code to bdrv_drained_begin() and make
bdrv_drain() a simple wrapper around bdrv_drained_begin/end().

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block/io.c | 69 ++++++++++++++++++++++++++++++--------------------------------
 1 file changed, 33 insertions(+), 36 deletions(-)

diff --git a/block/io.c b/block/io.c
index 2a28d63..9bc1d45 100644
--- a/block/io.c
+++ b/block/io.c
@@ -225,6 +225,34 @@ static void coroutine_fn bdrv_co_yield_to_drain(BlockDriverState *bs)
     assert(data.done);
 }
 
+void bdrv_drained_begin(BlockDriverState *bs)
+{
+    if (!bs->quiesce_counter++) {
+        aio_disable_external(bdrv_get_aio_context(bs));
+        bdrv_parent_drained_begin(bs);
+    }
+
+    bdrv_io_unplugged_begin(bs);
+    bdrv_drain_recurse(bs);
+    if (qemu_in_coroutine()) {
+        bdrv_co_yield_to_drain(bs);
+    } else {
+        bdrv_drain_poll(bs);
+    }
+    bdrv_io_unplugged_end(bs);
+}
+
+void bdrv_drained_end(BlockDriverState *bs)
+{
+    assert(bs->quiesce_counter > 0);
+    if (--bs->quiesce_counter > 0) {
+        return;
+    }
+
+    bdrv_parent_drained_end(bs);
+    aio_enable_external(bdrv_get_aio_context(bs));
+}
+
 /*
  * Wait for pending requests to complete on a single BlockDriverState subtree,
  * and suspend block driver's internal I/O until next request arrives.
@@ -238,26 +266,15 @@ static void coroutine_fn bdrv_co_yield_to_drain(BlockDriverState *bs)
  */
 void coroutine_fn bdrv_co_drain(BlockDriverState *bs)
 {
-    bdrv_parent_drained_begin(bs);
-    bdrv_io_unplugged_begin(bs);
-    bdrv_drain_recurse(bs);
-    bdrv_co_yield_to_drain(bs);
-    bdrv_io_unplugged_end(bs);
-    bdrv_parent_drained_end(bs);
+    assert(qemu_in_coroutine());
+    bdrv_drained_begin(bs);
+    bdrv_drained_end(bs);
 }
 
 void bdrv_drain(BlockDriverState *bs)
 {
-    bdrv_parent_drained_begin(bs);
-    bdrv_io_unplugged_begin(bs);
-    bdrv_drain_recurse(bs);
-    if (qemu_in_coroutine()) {
-        bdrv_co_yield_to_drain(bs);
-    } else {
-        bdrv_drain_poll(bs);
-    }
-    bdrv_io_unplugged_end(bs);
-    bdrv_parent_drained_end(bs);
+    bdrv_drained_begin(bs);
+    bdrv_drained_end(bs);
 }
 
 /*
@@ -2541,23 +2558,3 @@ void bdrv_io_unplugged_end(BlockDriverState *bs)
         }
     }
 }
-
-void bdrv_drained_begin(BlockDriverState *bs)
-{
-    if (!bs->quiesce_counter++) {
-        aio_disable_external(bdrv_get_aio_context(bs));
-    }
-    bdrv_parent_drained_begin(bs);
-    bdrv_drain(bs);
-}
-
-void bdrv_drained_end(BlockDriverState *bs)
-{
-    bdrv_parent_drained_end(bs);
-
-    assert(bs->quiesce_counter > 0);
-    if (--bs->quiesce_counter > 0) {
-        return;
-    }
-    aio_enable_external(bdrv_get_aio_context(bs));
-}
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH 3/4] block: Fix reconfiguring graph with drained nodes
  2016-05-23 16:55 [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes Kevin Wolf
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 1/4] block: Introduce bdrv_replace_child() Kevin Wolf
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 2/4] block: Make bdrv_drain() use bdrv_drained_begin/end() Kevin Wolf
@ 2016-05-23 16:55 ` Kevin Wolf
  2016-05-23 21:17   ` Eric Blake
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 4/4] block: Propagate .drained_begin/end callbacks Kevin Wolf
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Kevin Wolf @ 2016-05-23 16:55 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, stefanha, pbonzini, famz, qemu-devel

When changing the BlockDriverState that a BdrvChild points to while the
node is currently drained, we must call the .drained_end() parent
callback. Conversely, when this means attaching a new node that is
already drained, we need to call .drained_begin().

bdrv_root_attach_child() takes now an opaque parameter, which is needed
because the callbacks must also be called if we're attaching a new child
to the BlockBackend when the root node is already drained, and they need
a way to identify the BlockBackend. Previously, child->opaque was set
too late and the callbacks would still see it as NULL.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c                   | 18 ++++++++++++++----
 block/block-backend.c     |  9 +++++----
 include/block/block_int.h |  3 ++-
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/block.c b/block.c
index 351344e..598624f 100644
--- a/block.c
+++ b/block.c
@@ -1155,24 +1155,33 @@ static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs)
     BlockDriverState *old_bs = child->bs;
 
     if (old_bs) {
+        if (old_bs->quiesce_counter && child->role->drained_end) {
+            child->role->drained_end(child);
+        }
         QLIST_REMOVE(child, next_parent);
     }
+
+    child->bs = new_bs;
+
     if (new_bs) {
         QLIST_INSERT_HEAD(&new_bs->parents, child, next_parent);
+        if (new_bs->quiesce_counter && child->role->drained_begin) {
+            child->role->drained_begin(child);
+        }
     }
-
-    child->bs = new_bs;
 }
 
 BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
                                   const char *child_name,
-                                  const BdrvChildRole *child_role)
+                                  const BdrvChildRole *child_role,
+                                  void *opaque)
 {
     BdrvChild *child = g_new(BdrvChild, 1);
     *child = (BdrvChild) {
         .bs     = NULL,
         .name   = g_strdup(child_name),
         .role   = child_role,
+        .opaque = opaque,
     };
 
     bdrv_replace_child(child, child_bs);
@@ -1185,7 +1194,8 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
                              const char *child_name,
                              const BdrvChildRole *child_role)
 {
-    BdrvChild *child = bdrv_root_attach_child(child_bs, child_name, child_role);
+    BdrvChild *child = bdrv_root_attach_child(child_bs, child_name, child_role,
+                                              NULL);
     QLIST_INSERT_HEAD(&parent_bs->children, child, next);
     return child;
 }
diff --git a/block/block-backend.c b/block/block-backend.c
index 4e8298b..14e528e 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -161,8 +161,7 @@ BlockBackend *blk_new_open(const char *filename, const char *reference,
     }
 
     blk_set_enable_write_cache(blk, true);
-    blk->root = bdrv_root_attach_child(bs, "root", &child_root);
-    blk->root->opaque = blk;
+    blk->root = bdrv_root_attach_child(bs, "root", &child_root, blk);
 
     return blk;
 }
@@ -481,8 +480,7 @@ void blk_remove_bs(BlockBackend *blk)
 void blk_insert_bs(BlockBackend *blk, BlockDriverState *bs)
 {
     bdrv_ref(bs);
-    blk->root = bdrv_root_attach_child(bs, "root", &child_root);
-    blk->root->opaque = blk;
+    blk->root = bdrv_root_attach_child(bs, "root", &child_root, blk);
 
     notifier_list_notify(&blk->insert_bs_notifiers, blk);
     if (blk->public.throttle_state) {
@@ -1676,6 +1674,9 @@ static void blk_root_drained_begin(BdrvChild *child)
 {
     BlockBackend *blk = child->opaque;
 
+    /* Note that blk->root may not be accessible here yet if we are just
+     * attaching to a BlockDriverState that is drained. Use child instead. */
+
     if (blk->public.io_limits_disabled++ == 0) {
         throttle_group_restart_blk(blk);
     }
diff --git a/include/block/block_int.h b/include/block/block_int.h
index b6f4755..30a9717 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -719,7 +719,8 @@ void hmp_drive_add_node(Monitor *mon, const char *optstr);
 
 BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
                                   const char *child_name,
-                                  const BdrvChildRole *child_role);
+                                  const BdrvChildRole *child_role,
+                                  void *opaque);
 void bdrv_root_unref_child(BdrvChild *child);
 
 const char *bdrv_get_parent_name(const BlockDriverState *bs);
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH 4/4] block: Propagate .drained_begin/end callbacks
  2016-05-23 16:55 [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes Kevin Wolf
                   ` (2 preceding siblings ...)
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 3/4] block: Fix reconfiguring graph with drained nodes Kevin Wolf
@ 2016-05-23 16:55 ` Kevin Wolf
  2016-05-23 21:19   ` Eric Blake
  2016-05-24  1:01 ` [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes Fam Zheng
  2016-05-24  7:33 ` Kevin Wolf
  5 siblings, 1 reply; 11+ messages in thread
From: Kevin Wolf @ 2016-05-23 16:55 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, stefanha, pbonzini, famz, qemu-devel

When draining intermediate nodes (i.e. nodes that aren't the root node
for at least one of their parents; with node references, the user can
always configure the graph to create this situation), we need to
propagate the .drained_begin/end callbacks all the way up to the root
for the drain to be effective.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/block.c b/block.c
index 598624f..45cddd6 100644
--- a/block.c
+++ b/block.c
@@ -659,6 +659,18 @@ int bdrv_parse_cache_mode(const char *mode, int *flags, bool *writethrough)
     return 0;
 }
 
+static void bdrv_child_cb_drained_begin(BdrvChild *child)
+{
+    BlockDriverState *bs = child->opaque;
+    bdrv_drained_begin(bs);
+}
+
+static void bdrv_child_cb_drained_end(BdrvChild *child)
+{
+    BlockDriverState *bs = child->opaque;
+    bdrv_drained_end(bs);
+}
+
 /*
  * Returns the options and flags that a temporary snapshot should get, based on
  * the originally requested flags (the originally requested image will have
@@ -705,6 +717,8 @@ static void bdrv_inherited_options(int *child_flags, QDict *child_options,
 
 const BdrvChildRole child_file = {
     .inherit_options = bdrv_inherited_options,
+    .drained_begin   = bdrv_child_cb_drained_begin,
+    .drained_end     = bdrv_child_cb_drained_end,
 };
 
 /*
@@ -723,6 +737,8 @@ static void bdrv_inherited_fmt_options(int *child_flags, QDict *child_options,
 
 const BdrvChildRole child_format = {
     .inherit_options = bdrv_inherited_fmt_options,
+    .drained_begin   = bdrv_child_cb_drained_begin,
+    .drained_end     = bdrv_child_cb_drained_end,
 };
 
 /*
@@ -750,6 +766,8 @@ static void bdrv_backing_options(int *child_flags, QDict *child_options,
 
 static const BdrvChildRole child_backing = {
     .inherit_options = bdrv_backing_options,
+    .drained_begin   = bdrv_child_cb_drained_begin,
+    .drained_end     = bdrv_child_cb_drained_end,
 };
 
 static int bdrv_open_flags(BlockDriverState *bs, int flags)
@@ -1195,7 +1213,7 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
                              const BdrvChildRole *child_role)
 {
     BdrvChild *child = bdrv_root_attach_child(child_bs, child_name, child_role,
-                                              NULL);
+                                              parent_bs);
     QLIST_INSERT_HEAD(&parent_bs->children, child, next);
     return child;
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH 1/4] block: Introduce bdrv_replace_child()
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 1/4] block: Introduce bdrv_replace_child() Kevin Wolf
@ 2016-05-23 20:02   ` Eric Blake
  0 siblings, 0 replies; 11+ messages in thread
From: Eric Blake @ 2016-05-23 20:02 UTC (permalink / raw)
  To: Kevin Wolf, qemu-block; +Cc: pbonzini, famz, qemu-devel, stefanha

[-- Attachment #1: Type: text/plain, Size: 575 bytes --]

On 05/23/2016 10:55 AM, Kevin Wolf wrote:
> This adds a common function that is called when attaching a new child to
> a parent, removing a child from a parent and when reconfiguring the
> graph so that an existing child points to a different node now.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  block.c | 26 ++++++++++++++++++++------
>  1 file changed, 20 insertions(+), 6 deletions(-)
> 

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH 2/4] block: Make bdrv_drain() use bdrv_drained_begin/end()
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 2/4] block: Make bdrv_drain() use bdrv_drained_begin/end() Kevin Wolf
@ 2016-05-23 21:10   ` Eric Blake
  0 siblings, 0 replies; 11+ messages in thread
From: Eric Blake @ 2016-05-23 21:10 UTC (permalink / raw)
  To: Kevin Wolf, qemu-block; +Cc: pbonzini, famz, qemu-devel, stefanha

[-- Attachment #1: Type: text/plain, Size: 896 bytes --]

On 05/23/2016 10:55 AM, Kevin Wolf wrote:
> Until now, bdrv_drained_begin() used bdrv_drain() internally to drain
> the queue. This is kind of backwards and caused quiescing code to be
> duplicated because bdrv_drained_begin() had to ensure that no new
> requests come in even after bdrv_drain() returns, whereas bdrv_drain()
> had to have them because it could be called from other places.
> 
> Instead move the bdrv_drain() code to bdrv_drained_begin() and make
> bdrv_drain() a simple wrapper around bdrv_drained_begin/end().
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  block/io.c | 69 ++++++++++++++++++++++++++++++--------------------------------
>  1 file changed, 33 insertions(+), 36 deletions(-)
> 

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH 3/4] block: Fix reconfiguring graph with drained nodes
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 3/4] block: Fix reconfiguring graph with drained nodes Kevin Wolf
@ 2016-05-23 21:17   ` Eric Blake
  0 siblings, 0 replies; 11+ messages in thread
From: Eric Blake @ 2016-05-23 21:17 UTC (permalink / raw)
  To: Kevin Wolf, qemu-block; +Cc: pbonzini, famz, qemu-devel, stefanha

[-- Attachment #1: Type: text/plain, Size: 1086 bytes --]

On 05/23/2016 10:55 AM, Kevin Wolf wrote:
> When changing the BlockDriverState that a BdrvChild points to while the
> node is currently drained, we must call the .drained_end() parent
> callback. Conversely, when this means attaching a new node that is
> already drained, we need to call .drained_begin().
> 
> bdrv_root_attach_child() takes now an opaque parameter, which is needed
> because the callbacks must also be called if we're attaching a new child
> to the BlockBackend when the root node is already drained, and they need
> a way to identify the BlockBackend. Previously, child->opaque was set
> too late and the callbacks would still see it as NULL.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  block.c                   | 18 ++++++++++++++----
>  block/block-backend.c     |  9 +++++----
>  include/block/block_int.h |  3 ++-
>  3 files changed, 21 insertions(+), 9 deletions(-)
> 

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH 4/4] block: Propagate .drained_begin/end callbacks
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 4/4] block: Propagate .drained_begin/end callbacks Kevin Wolf
@ 2016-05-23 21:19   ` Eric Blake
  0 siblings, 0 replies; 11+ messages in thread
From: Eric Blake @ 2016-05-23 21:19 UTC (permalink / raw)
  To: Kevin Wolf, qemu-block; +Cc: pbonzini, famz, qemu-devel, stefanha

[-- Attachment #1: Type: text/plain, Size: 676 bytes --]

On 05/23/2016 10:55 AM, Kevin Wolf wrote:
> When draining intermediate nodes (i.e. nodes that aren't the root node
> for at least one of their parents; with node references, the user can
> always configure the graph to create this situation), we need to
> propagate the .drained_begin/end callbacks all the way up to the root
> for the drain to be effective.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  block.c | 20 +++++++++++++++++++-
>  1 file changed, 19 insertions(+), 1 deletion(-)
> 

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes
  2016-05-23 16:55 [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes Kevin Wolf
                   ` (3 preceding siblings ...)
  2016-05-23 16:55 ` [Qemu-devel] [PATCH 4/4] block: Propagate .drained_begin/end callbacks Kevin Wolf
@ 2016-05-24  1:01 ` Fam Zheng
  2016-05-24  7:33 ` Kevin Wolf
  5 siblings, 0 replies; 11+ messages in thread
From: Fam Zheng @ 2016-05-24  1:01 UTC (permalink / raw)
  To: Kevin Wolf; +Cc: qemu-block, stefanha, pbonzini, qemu-devel

On Mon, 05/23 18:55, Kevin Wolf wrote:
> While working on the series that converts block jobs to using a separate
> BlockBackend, I noticed that I need to do some drain fixes first. So here they
> are.
> 
> Patches 1 and 2 are just preparation, patches 3 and 4 are the actual fixes.
> 
> Kevin Wolf (4):
>   block: Introduce bdrv_replace_child()
>   block: Make bdrv_drain() use bdrv_drained_begin/end()
>   block: Fix reconfiguring graph with drained nodes
>   block: Propagate .drained_begin/end callbacks

Reviewed-by: Fam Zheng <famz@redhat.com>

> 
>  block.c                   | 58 +++++++++++++++++++++++++++++++++------
>  block/block-backend.c     |  9 ++++---
>  block/io.c                | 69 +++++++++++++++++++++++------------------------
>  include/block/block_int.h |  3 ++-
>  4 files changed, 90 insertions(+), 49 deletions(-)
> 
> -- 
> 1.8.3.1
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes
  2016-05-23 16:55 [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes Kevin Wolf
                   ` (4 preceding siblings ...)
  2016-05-24  1:01 ` [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes Fam Zheng
@ 2016-05-24  7:33 ` Kevin Wolf
  5 siblings, 0 replies; 11+ messages in thread
From: Kevin Wolf @ 2016-05-24  7:33 UTC (permalink / raw)
  To: qemu-block; +Cc: stefanha, pbonzini, famz, qemu-devel

Am 23.05.2016 um 18:55 hat Kevin Wolf geschrieben:
> While working on the series that converts block jobs to using a separate
> BlockBackend, I noticed that I need to do some drain fixes first. So here they
> are.
> 
> Patches 1 and 2 are just preparation, patches 3 and 4 are the actual fixes.

Thanks for the quick reviews! Applied to the block branch.

Kevin

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2016-05-24  7:33 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-23 16:55 [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes Kevin Wolf
2016-05-23 16:55 ` [Qemu-devel] [PATCH 1/4] block: Introduce bdrv_replace_child() Kevin Wolf
2016-05-23 20:02   ` Eric Blake
2016-05-23 16:55 ` [Qemu-devel] [PATCH 2/4] block: Make bdrv_drain() use bdrv_drained_begin/end() Kevin Wolf
2016-05-23 21:10   ` Eric Blake
2016-05-23 16:55 ` [Qemu-devel] [PATCH 3/4] block: Fix reconfiguring graph with drained nodes Kevin Wolf
2016-05-23 21:17   ` Eric Blake
2016-05-23 16:55 ` [Qemu-devel] [PATCH 4/4] block: Propagate .drained_begin/end callbacks Kevin Wolf
2016-05-23 21:19   ` Eric Blake
2016-05-24  1:01 ` [Qemu-devel] [PATCH 0/4] block: BdrvChildRole.drained_begin/end fixes Fam Zheng
2016-05-24  7:33 ` Kevin Wolf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).