qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC PATCH 7/8] block: use the new _change_ API instead of _can_set_


From: Paolo Bonzini
Subject: Re: [RFC PATCH 7/8] block: use the new _change_ API instead of _can_set_ and _set_
Date: Mon, 18 Jul 2022 18:39:48 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0

On 7/12/22 23:19, Emanuele Giuseppe Esposito wrote:
diff --git a/block/block-backend.c b/block/block-backend.c
index 674eaaa2bf..6e90ac3a6a 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -2184,8 +2184,12 @@ static int blk_do_set_aio_context(BlockBackend *blk, 
AioContext *new_context,
          bdrv_ref(bs);
if (update_root_node) {
-            ret = bdrv_child_try_set_aio_context(bs, new_context, blk->root,
-                                                 errp);
+            /*
+             * update_root_node MUST be false for 
blk_root_set_aio_ctx_commit(),
+             * as we are already in the commit function of a transaction.
+             */
+            ret = bdrv_child_try_change_aio_context(bs, new_context, blk->root,
+                                                    errp);
              if (ret < 0) {
                  bdrv_unref(bs);
                  return ret;


Looking further at blk_do_set_aio_context:

        if (tgm->throttle_state) {
            bdrv_drained_begin(bs);
            throttle_group_detach_aio_context(tgm);
            throttle_group_attach_aio_context(tgm, new_context);
            bdrv_drained_end(bs);
        }

Perhaps the drained_begin/drained_end pair can be moved to blk_set_aio_context? It shouldn't be needed from the change_aio_ctx callback, because bs is already drained. If so, blk_do_set_aio_context would become just:

     if (tgm->throttle_state) {
         throttle_group_detach_aio_context(tgm);
         throttle_group_attach_aio_context(tgm, new_context);
     }
     blk->ctx = new_context;

and blk_set_aio_context would be something like:

    if (bs) {
        bdrv_ref(bs);
        ret = bdrv_child_try_set_aio_context(bs, new_context, blk->root,
                                             errp);
        if (ret < 0) {
            goto out_no_drain;
        }
        bdrv_drained_begin(bs);
    }
    ret = blk_do_set_aio_context(blk, new_context, errp);
    if (bs) {
        bdrv_drained_end(bs);
out_no_drain;
        bdrv_unref(bs);
    }
    return ret;

Paolo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]