qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Jeff Cody <jcody@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: qemu-block@nongnu.org, Kevin Wolf <kwolf@redhat.com>,
	Fam Zheng <famz@redhat.com>,
	qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [Qemu-block] [PATCH v3 02/16] block: BDS deletion in bdrv_do_drained_begin()
Date: Mon, 19 Mar 2018 23:16:10 -0400	[thread overview]
Message-ID: <20180320031610.GE2962@localhost.localdomain> (raw)
In-Reply-To: <20180228180507.3964-3-mreitz@redhat.com>

On Wed, Feb 28, 2018 at 07:04:53PM +0100, Max Reitz wrote:
> Draining a BDS (in the main loop) may cause it to go be deleted.  That
> is rather suboptimal if we still plan to access it afterwards, so let us
> enclose the main body of the function with a bdrv_ref()/bdrv_unref()
> pair.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
>  block/io.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
> 
> diff --git a/block/io.c b/block/io.c
> index ead12c4136..3b61e26114 100644
> --- a/block/io.c
> +++ b/block/io.c
> @@ -294,12 +294,27 @@ void bdrv_do_drained_begin(BlockDriverState *bs, bool recursive,
>                             BdrvChild *parent)
>  {
>      BdrvChild *child, *next;
> +    bool in_main_loop =
> +        qemu_get_current_aio_context() == qemu_get_aio_context();
> +    /* bdrv_close() invokes bdrv_drain() with bs->refcnt == 0; then,
> +     * we may not invoke bdrv_ref()/bdrv_unref() because the latter
> +     * would result in the refcount going back to 0, creating an
> +     * infinite loop.
> +     * Also, we have to be in the main loop because we may not call
> +     * bdrv_unref() elsewhere.  But because of that, the BDS is not in
> +     * danger of going away without the bdrv_ref()/bdrv_unref() pair
> +     * elsewhere, so we are fine then. */
> +    bool add_ref = in_main_loop && bs->refcnt > 0;
>  
>      if (qemu_in_coroutine()) {
>          bdrv_co_yield_to_drain(bs, true, recursive, parent);
>          return;
>      }
>  
> +    if (add_ref) {
> +        bdrv_ref(bs);
> +    }
> +
>      /* Stop things in parent-to-child order */
>      if (atomic_fetch_inc(&bs->quiesce_counter) == 0) {
>          aio_disable_external(bdrv_get_aio_context(bs));
> @@ -315,6 +330,10 @@ void bdrv_do_drained_begin(BlockDriverState *bs, bool recursive,
>              bdrv_do_drained_begin(child->bs, true, child);
>          }
>      }
> +
> +    if (add_ref) {
> +        bdrv_unref(bs);
> +    }
>  }
>  
>  void bdrv_drained_begin(BlockDriverState *bs)
> -- 
> 2.14.3
> 
> 

Reviewed-by: Jeff Cody <jcody@redhat.com>

  reply	other threads:[~2018-03-20  3:16 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-28 18:04 [Qemu-devel] [PATCH v3 00/16] block/mirror: Add active-sync mirroring Max Reitz
2018-02-28 18:04 ` [Qemu-devel] [PATCH v3 01/16] block: BDS deletion during bdrv_drain_recurse Max Reitz
2018-03-20  3:10   ` [Qemu-devel] [Qemu-block] " Jeff Cody
2018-02-28 18:04 ` [Qemu-devel] [PATCH v3 02/16] block: BDS deletion in bdrv_do_drained_begin() Max Reitz
2018-03-20  3:16   ` Jeff Cody [this message]
2018-02-28 18:04 ` [Qemu-devel] [PATCH v3 03/16] tests: Add bdrv-drain test for node deletion Max Reitz
2018-02-28 18:04 ` [Qemu-devel] [PATCH v3 04/16] block/mirror: Pull out mirror_perform() Max Reitz
2018-03-20  3:30   ` [Qemu-devel] [Qemu-block] " Jeff Cody
2018-02-28 18:04 ` [Qemu-devel] [PATCH v3 05/16] block/mirror: Convert to coroutines Max Reitz
2018-02-28 18:04 ` [Qemu-devel] [PATCH v3 06/16] block/mirror: Use CoQueue to wait on in-flight ops Max Reitz
2018-02-28 18:04 ` [Qemu-devel] [PATCH v3 07/16] block/mirror: Wait for in-flight op conflicts Max Reitz
2018-02-28 18:04 ` [Qemu-devel] [PATCH v3 08/16] block/mirror: Use source as a BdrvChild Max Reitz
2018-02-28 18:05 ` [Qemu-devel] [PATCH v3 09/16] block: Generalize should_update_child() rule Max Reitz
2018-02-28 18:05 ` [Qemu-devel] [PATCH v3 10/16] hbitmap: Add @advance param to hbitmap_iter_next() Max Reitz
2018-02-28 18:05 ` [Qemu-devel] [PATCH v3 11/16] test-hbitmap: Add non-advancing iter_next tests Max Reitz
2018-03-01  7:00   ` Fam Zheng
2018-02-28 18:05 ` [Qemu-devel] [PATCH v3 12/16] block/dirty-bitmap: Add bdrv_dirty_iter_next_area Max Reitz
2018-03-15 19:51   ` John Snow
2018-02-28 18:05 ` [Qemu-devel] [PATCH v3 13/16] block/mirror: Add MirrorBDSOpaque Max Reitz
2018-02-28 18:05 ` [Qemu-devel] [PATCH v3 14/16] block/mirror: Add active mirroring Max Reitz
2018-02-28 18:05 ` [Qemu-devel] [PATCH v3 15/16] block/mirror: Add copy mode QAPI interface Max Reitz
2018-03-20 17:35   ` Eric Blake
2018-03-21 11:25     ` Max Reitz
2018-02-28 18:05 ` [Qemu-devel] [PATCH v3 16/16] iotests: Add test for active mirroring Max Reitz
2018-02-28 18:55 ` [Qemu-devel] [PATCH v3 00/16] block/mirror: Add active-sync mirroring no-reply
2018-03-01  7:08 ` Fam Zheng

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=20180320031610.GE2962@localhost.localdomain \
    --to=jcody@redhat.com \
    --cc=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /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).