qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, richard.henderson@linaro.org, qemu-devel@nongnu.org
Subject: [PULL 05/23] block: Fix AioContext locking in bdrv_attach_child_common()
Date: Wed, 28 Jun 2023 16:15:08 +0200	[thread overview]
Message-ID: <20230628141526.293104-6-kwolf@redhat.com> (raw)
In-Reply-To: <20230628141526.293104-1-kwolf@redhat.com>

The function can move the child node to a different AioContext. In this
case, it also must take the AioContext lock for the new context before
calling functions that require the caller to hold the AioContext for the
child node.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-ID: <20230605085711.21261-6-kwolf@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/block.c b/block.c
index 213a09643d..2c8a3ffe19 100644
--- a/block.c
+++ b/block.c
@@ -2989,6 +2989,10 @@ static TransactionActionDrv bdrv_attach_child_common_drv = {
  * Function doesn't update permissions, caller is responsible for this.
  *
  * Returns new created child.
+ *
+ * The caller must hold the AioContext lock for @child_bs. Both @parent_bs and
+ * @child_bs can move to a different AioContext in this function. Callers must
+ * make sure that their AioContext locking is still correct after this.
  */
 static BdrvChild *bdrv_attach_child_common(BlockDriverState *child_bs,
                                            const char *child_name,
@@ -2999,7 +3003,7 @@ static BdrvChild *bdrv_attach_child_common(BlockDriverState *child_bs,
                                            Transaction *tran, Error **errp)
 {
     BdrvChild *new_child;
-    AioContext *parent_ctx;
+    AioContext *parent_ctx, *new_child_ctx;
     AioContext *child_ctx = bdrv_get_aio_context(child_bs);
 
     assert(child_class->get_parent_desc);
@@ -3050,6 +3054,12 @@ static BdrvChild *bdrv_attach_child_common(BlockDriverState *child_bs,
         }
     }
 
+    new_child_ctx = bdrv_get_aio_context(child_bs);
+    if (new_child_ctx != child_ctx) {
+        aio_context_release(child_ctx);
+        aio_context_acquire(new_child_ctx);
+    }
+
     bdrv_ref(child_bs);
     /*
      * Let every new BdrvChild start with a drained parent. Inserting the child
@@ -3079,11 +3089,20 @@ static BdrvChild *bdrv_attach_child_common(BlockDriverState *child_bs,
     };
     tran_add(tran, &bdrv_attach_child_common_drv, s);
 
+    if (new_child_ctx != child_ctx) {
+        aio_context_release(new_child_ctx);
+        aio_context_acquire(child_ctx);
+    }
+
     return new_child;
 }
 
 /*
  * Function doesn't update permissions, caller is responsible for this.
+ *
+ * The caller must hold the AioContext lock for @child_bs. Both @parent_bs and
+ * @child_bs can move to a different AioContext in this function. Callers must
+ * make sure that their AioContext locking is still correct after this.
  */
 static BdrvChild *bdrv_attach_child_noperm(BlockDriverState *parent_bs,
                                            BlockDriverState *child_bs,
-- 
2.41.0



  parent reply	other threads:[~2023-06-28 14:18 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-28 14:15 [PULL 00/23] Block layer patches Kevin Wolf
2023-06-28 14:15 ` [PULL 01/23] iotests: Test active commit with iothread and background I/O Kevin Wolf
2023-06-28 14:15 ` [PULL 02/23] qdev-properties-system: Lock AioContext for blk_insert_bs() Kevin Wolf
2023-06-28 14:15 ` [PULL 03/23] test-block-iothread: " Kevin Wolf
2023-06-28 14:15 ` [PULL 04/23] block: Fix AioContext locking in bdrv_open_child() Kevin Wolf
2023-06-28 14:15 ` Kevin Wolf [this message]
2023-06-28 14:15 ` [PULL 06/23] block: Fix AioContext locking in bdrv_reopen_parse_file_or_backing() Kevin Wolf
2023-06-28 14:15 ` [PULL 07/23] block: Fix AioContext locking in bdrv_open_inherit() Kevin Wolf
2023-06-28 14:15 ` [PULL 08/23] block: Fix AioContext locking in bdrv_open_backing_file() Kevin Wolf
2023-06-28 14:15 ` [PULL 09/23] blockjob: Fix AioContext locking in block_job_add_bdrv() Kevin Wolf
2023-06-28 14:15 ` [PULL 10/23] graph-lock: Unlock the AioContext while polling Kevin Wolf
2023-06-28 14:15 ` [PULL 11/23] Revert "graph-lock: Disable locking for now" Kevin Wolf
2023-07-10 12:22   ` Klaus Jensen
2023-07-10 12:40     ` Kevin Wolf
2023-07-10 14:03       ` Klaus Jensen
2023-06-28 14:15 ` [PULL 12/23] file-posix: remove incorrect coroutine_fn calls Kevin Wolf
2023-06-28 14:15 ` [PULL 13/23] qed: mark more functions as coroutine_fns and GRAPH_RDLOCK Kevin Wolf
2023-06-28 14:15 ` [PULL 14/23] vpc: " Kevin Wolf
2023-06-28 14:15 ` [PULL 15/23] bochs: " Kevin Wolf
2023-06-28 14:15 ` [PULL 16/23] block: mark another function as coroutine_fns and GRAPH_UNLOCKED Kevin Wolf
2023-06-28 14:15 ` [PULL 17/23] cloop: mark more functions as coroutine_fns and GRAPH_RDLOCK Kevin Wolf
2023-06-28 14:15 ` [PULL 18/23] dmg: " Kevin Wolf
2023-06-28 14:15 ` [PULL 19/23] vmdk: " Kevin Wolf
2023-06-28 14:15 ` [PULL 20/23] vhdx: " Kevin Wolf
2023-06-28 14:15 ` [PULL 21/23] qcow2: " Kevin Wolf
2023-06-28 14:15 ` [PULL 22/23] block: use bdrv_co_getlength in coroutine context Kevin Wolf
2023-06-28 14:15 ` [PULL 23/23] block: use bdrv_co_debug_event " Kevin Wolf
2023-06-29  6:11 ` [PULL 00/23] Block layer patches Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230628141526.293104-6-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).