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>
next prev parent 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).