[09/15] block: Move node without parents to main AioContext
diff mbox series

Message ID 20190523160104.21258-10-kwolf@redhat.com
State New
Headers show
Series
  • block: AioContext management, part 2
Related show

Commit Message

Kevin Wolf May 23, 2019, 4 p.m. UTC
A node should only be in a non-default AioContext if a user is attached
to it that requires this. When the last parent of a node is gone, it can
move back to the main AioContext.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c                     | 4 ++++
 tests/test-bdrv-drain.c     | 2 +-
 tests/test-block-iothread.c | 3 +--
 3 files changed, 6 insertions(+), 3 deletions(-)

Patch
diff mbox series

diff --git a/block.c b/block.c
index 5219f61279..19268f52f8 100644
--- a/block.c
+++ b/block.c
@@ -2235,6 +2235,10 @@  static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs)
         bdrv_get_cumulative_perm(old_bs, &perm, &shared_perm);
         bdrv_check_perm(old_bs, NULL, perm, shared_perm, NULL, &error_abort);
         bdrv_set_perm(old_bs, perm, shared_perm);
+
+        /* When the parent requiring a non-default AioContext is removed, the
+         * node moves back to the main AioContext */
+        bdrv_try_set_aio_context(old_bs, qemu_get_aio_context(), NULL);
     }
 
     if (new_bs) {
diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c
index 447f6d12eb..2ff04db07a 100644
--- a/tests/test-bdrv-drain.c
+++ b/tests/test-bdrv-drain.c
@@ -1003,7 +1003,7 @@  static void test_blockjob_common_drain_node(enum drain_type drain_type,
 
     if (use_iothread) {
         blk_set_aio_context(blk_src, qemu_get_aio_context(), &error_abort);
-        blk_set_aio_context(blk_target, qemu_get_aio_context(), &error_abort);
+        assert(blk_get_aio_context(blk_target) == qemu_get_aio_context());
     }
     aio_context_release(ctx);
 
diff --git a/tests/test-block-iothread.c b/tests/test-block-iothread.c
index f41082e3bd..79d9cf8a57 100644
--- a/tests/test-block-iothread.c
+++ b/tests/test-block-iothread.c
@@ -713,9 +713,8 @@  static void test_attach_preserve_blk_ctx(void)
 
     /* Remove the node again */
     blk_remove_bs(blk);
-    /* TODO bs should move back to main context here */
     g_assert(blk_get_aio_context(blk) == ctx);
-    g_assert(bdrv_get_aio_context(bs) == ctx);
+    g_assert(bdrv_get_aio_context(bs) == qemu_get_aio_context());
 
     /* Re-attach the node */
     blk_insert_bs(blk, bs, &error_abort);