qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: mreitz@redhat.com, famz@redhat.com, qemu-devel@nongnu.org,
	stefanha@redhat.com, benoit.canet@nodalink.com
Subject: Re: [Qemu-devel] [PATCH v3 06/23] block: Make BlockBackend own its BlockDriverState
Date: Tue, 23 Sep 2014 15:12:40 +0200	[thread overview]
Message-ID: <20140923131240.GH3871@noname.str.redhat.com> (raw)
In-Reply-To: <1410891148-28849-7-git-send-email-armbru@redhat.com>

Am 16.09.2014 um 20:12 hat Markus Armbruster geschrieben:
> On BlockBackend destruction, unref its BlockDriverState.  Replaces the
> callers' unrefs.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  block/block-backend.c |  6 ++----
>  blockdev.c            |  8 ++------
>  hw/block/xen_disk.c   |  6 +++---
>  qemu-img.c            | 35 +----------------------------------
>  qemu-io.c             |  5 -----
>  qemu-nbd.c            |  1 -
>  6 files changed, 8 insertions(+), 53 deletions(-)
> 
> diff --git a/block/block-backend.c b/block/block-backend.c
> index be9acda..ed4873e 100644
> --- a/block/block-backend.c
> +++ b/block/block-backend.c
> @@ -54,8 +54,6 @@ BlockBackend *blk_new(const char *name, Error **errp)
>  
>  /*
>   * Create a new BlockBackend with a new BlockDriverState attached.
> - * Both have a reference count of one.  Caller owns *both* references.
> - * TODO Let caller own only the BlockBackend reference
>   * Otherwise just like blk_new(), which see.
>   */
>  BlockBackend *blk_new_with_bs(const char *name, Error **errp)
> @@ -83,7 +81,9 @@ static void blk_delete(BlockBackend *blk)
>  {
>      assert(!blk->refcnt);
>      if (blk->bs) {
> +        assert(blk->bs->blk == blk);
>          blk->bs->blk = NULL;
> +        bdrv_unref(blk->bs);
>          blk->bs = NULL;
>      }
>      /* Avoid double-remove after blk_hide_on_behalf_of_do_drive_del() */
> @@ -121,8 +121,6 @@ void blk_ref(BlockBackend *blk)
>   * Decrement @blk's reference count.
>   * If this drops it to zero, destroy @blk.
>   * For convenience, do nothing if @blk is null.
> - * Does *not* touch the attached BlockDriverState's reference count.
> - * TODO Decrement it!
>   */
>  void blk_unref(BlockBackend *blk)
>  {
> diff --git a/blockdev.c b/blockdev.c
> index 1c97faa..3a6fd46 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -108,7 +108,7 @@ void blockdev_auto_del(BlockDriverState *bs)
>      DriveInfo *dinfo = blk_legacy_dinfo(blk);
>  
>      if (dinfo && dinfo->auto_del) {
> -        drive_del(dinfo);
> +        blk_unref(blk);
>      }
>  }
>  
> @@ -219,7 +219,6 @@ static void bdrv_format_print(void *opaque, const char *name)
>  
>  void drive_del(DriveInfo *dinfo)
>  {
> -    bdrv_unref(dinfo->bdrv);
>      blk_unref(blk_by_legacy_dinfo(dinfo));
>  }
>  
> @@ -522,7 +521,6 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
>      return blk;
>  
>  err:
> -    bdrv_unref(bs);
>      blk_unref(blk);
>  early_err:
>      qemu_opts_del(opts);
> @@ -1782,9 +1780,8 @@ int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
>          /* Further I/O must not pause the guest */
>          bdrv_set_on_error(bs, BLOCKDEV_ON_ERROR_REPORT,
>                            BLOCKDEV_ON_ERROR_REPORT);
> -        /* FIXME bs->blk leaked when bs dies */

Which hunk of the patch fixes this? I can't see a new blk_unref()
anywhere.

Hm, rereading this before sending the mail out, I think what this
comment was intended for is already fixed in patch 4. I'll leave my
original thoughts here anyway because they are about an independent
problem:

I never completely understood where this anonymous BDS gets freed
eventually. It only occurs to me now that this is probably because it
doesn't? The original commit (d22b2f41) doesn't mention how this was
intended to work.

In some cases (and this may cover all of the original cases) the autodel
behaviour might actually happen to free it when the device is gone. But
if the BDS was created with blockdev-add, it certainly isn't (that would
be a bug introduced by my blockdev-add series). If there is any
non-hotpluggable device that doesn't call blockdev_mark_auto_del() in
its unrealize function, it also isn't freed for that device.

Can we make this whole mechanism more obvious eventually by getting a
user/monitor reference only for blockdev-add, but not for -drive, and
getting a second reference for devices that use the BB?

>      } else {
> -        drive_del(dinfo);
> +        blk_unref(blk);
>      }
>  
>      aio_context_release(aio_context);

Looks like I once again found questions that took me a lot of time to
investigate and perhaps even a bug, but it doesn't look like a bug in
this patch. Feel free to add:

Reviewed-by: Kevin Wolf <kwolf@redhat.com>

Kevin

  parent reply	other threads:[~2014-09-23 13:13 UTC|newest]

Thread overview: 110+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-16 18:12 [Qemu-devel] [PATCH v3 00/23] Split BlockBackend off BDS with an axe Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 01/23] block: Split bdrv_new_root() off bdrv_new() Markus Armbruster
2014-09-18 14:44   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 02/23] block: New BlockBackend Markus Armbruster
2014-09-19 16:17   ` Kevin Wolf
2014-09-19 17:13     ` Markus Armbruster
2014-09-20 19:04   ` Max Reitz
2014-09-22  6:56     ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 03/23] block: Connect BlockBackend to BlockDriverState Markus Armbruster
2014-09-20 19:08   ` Max Reitz
2014-09-22 14:59   ` Kevin Wolf
2014-09-22 16:34     ` Markus Armbruster
2014-09-23 11:45       ` Kevin Wolf
2014-09-23 12:52         ` Markus Armbruster
2014-09-23 13:36           ` Kevin Wolf
2014-09-23 15:29             ` Markus Armbruster
2014-09-25 21:54             ` Benoît Canet
2014-09-30 10:40   ` Kevin Wolf
2014-09-30 10:56     ` Markus Armbruster
2014-09-30 11:10       ` Kevin Wolf
2014-09-30 12:03         ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 04/23] block: Connect BlockBackend and DriveInfo Markus Armbruster
2014-09-20 19:38   ` Max Reitz
2014-09-22  7:33     ` Markus Armbruster
2014-09-22 17:15   ` Kevin Wolf
2014-09-23 10:57     ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 05/23] block: Code motion to get rid of stubs/blockdev.c Markus Armbruster
2014-09-20 19:46   ` Max Reitz
2014-09-23 12:15   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 06/23] block: Make BlockBackend own its BlockDriverState Markus Armbruster
2014-09-20 20:10   ` Max Reitz
2014-09-23 13:12   ` Kevin Wolf [this message]
2014-09-23 16:24     ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 07/23] block: Eliminate bdrv_iterate(), use bdrv_next() Markus Armbruster
2014-09-20 20:29   ` Max Reitz
2014-09-25 11:25   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 08/23] block: Eliminate BlockDriverState member device_name[] Markus Armbruster
2014-09-20 20:49   ` Max Reitz
2014-09-25 11:37   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 09/23] block: Merge BlockBackend and BlockDriverState name spaces Markus Armbruster
2014-09-20 20:52   ` Max Reitz
2014-09-25 12:57   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 10/23] block: Eliminate DriveInfo member bdrv, use blk_by_legacy_dinfo() Markus Armbruster
2014-09-17 11:24   ` Benoît Canet
2014-09-18  7:11     ` Markus Armbruster
2014-09-20 21:09   ` Max Reitz
2014-09-25 13:06   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 11/23] block: Rename BlockDriverAIOCB* to BlockAIOCB* Markus Armbruster
2014-09-20 21:16   ` Max Reitz
2014-09-25 13:15   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 12/23] virtio-blk: Drop redundant VirtIOBlock member conf Markus Armbruster
2014-09-17 11:31   ` Benoît Canet
2014-09-20 21:22   ` Max Reitz
2014-09-22  7:34     ` Markus Armbruster
2014-09-25 13:18   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 13/23] virtio-blk: Rename VirtIOBlkConf variables to conf Markus Armbruster
2014-09-17 11:35   ` Benoît Canet
2014-09-18  7:17     ` Markus Armbruster
2014-09-20 21:25   ` Max Reitz
2014-09-26 13:22   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 14/23] hw: Convert from BlockDriverState to BlockBackend, mostly Markus Armbruster
2014-09-20 22:01   ` Max Reitz
2014-09-22  7:42     ` Markus Armbruster
2014-09-26 14:26   ` Kevin Wolf
2014-09-26 15:00     ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 15/23] ide: Complete conversion from BlockDriverState to BlockBackend Markus Armbruster
2014-09-20 22:05   ` Max Reitz
2014-09-29 12:07   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 16/23] pc87312: Drop unused members of PC87312State Markus Armbruster
2014-09-17 11:44   ` Benoît Canet
2014-09-20 22:07   ` Max Reitz
2014-09-29 12:08   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 17/23] blockdev: Drop superfluous DriveInfo member id Markus Armbruster
2014-09-17 11:43   ` Benoît Canet
2014-09-22 12:58   ` Max Reitz
2014-09-29 12:13   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 18/23] blockdev: Fix blockdev-add not to create IDE drive (0, 0) Markus Armbruster
2014-09-17 12:09   ` Benoît Canet
2014-09-22 13:05   ` Max Reitz
2014-09-29 12:24   ` Kevin Wolf
2014-09-29 13:05     ` Markus Armbruster
2014-09-29 15:34       ` Kevin Wolf
2014-09-30  6:21         ` Markus Armbruster
2014-09-29 13:12   ` Kevin Wolf
2014-09-29 14:04     ` Markus Armbruster
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 19/23] blockdev: Drop DriveInfo member enable_auto_del Markus Armbruster
2014-09-17 12:12   ` Benoît Canet
2014-09-22 13:16   ` Max Reitz
2014-09-22 15:06     ` Markus Armbruster
2014-09-22 15:12       ` Max Reitz
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 20/23] block/qapi: Convert qmp_query_block() to BlockBackend Markus Armbruster
2014-09-22 12:05   ` Benoît Canet
2014-09-22 13:22   ` Max Reitz
2014-09-29 13:26   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 21/23] blockdev: Convert qmp_eject(), qmp_change_blockdev() " Markus Armbruster
2014-09-22 12:08   ` Benoît Canet
2014-09-22 13:26   ` Max Reitz
2014-09-22 15:07     ` Markus Armbruster
2014-09-30  9:55   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 22/23] block: Lift device model API into BlockBackend Markus Armbruster
2014-09-22 12:13   ` Benoît Canet
2014-09-22 12:54     ` Markus Armbruster
2014-09-22 13:58   ` Max Reitz
2014-09-30 10:49   ` Kevin Wolf
2014-09-16 18:12 ` [Qemu-devel] [PATCH v3 23/23] block: Make device model's references to BlockBackend strong Markus Armbruster
2014-09-22 12:06   ` Benoît Canet
2014-09-22 14:06   ` Max Reitz
2014-09-22 15:08     ` Markus Armbruster
2014-09-30 11:01   ` Kevin Wolf
2014-09-30 12:04     ` Markus Armbruster

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=20140923131240.GH3871@noname.str.redhat.com \
    --to=kwolf@redhat.com \
    --cc=armbru@redhat.com \
    --cc=benoit.canet@nodalink.com \
    --cc=famz@redhat.com \
    --cc=mreitz@redhat.com \
    --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).