qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: Fam Zheng <famz@redhat.com>,
	qemu-block@nongnu.org, qemu-devel@nongnu.org,
	Markus Armbruster <armbru@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v4 00/11] block: Rework bdrv_close_all()
Date: Mon, 02 Mar 2015 10:15:03 -0500	[thread overview]
Message-ID: <54F47E77.6000007@redhat.com> (raw)
In-Reply-To: <20150302092542.GA4443@noname.redhat.com>

On 2015-03-02 at 04:25, Kevin Wolf wrote:
> Am 27.02.2015 um 17:43 hat Max Reitz geschrieben:
>> Currently, bdrv_close_all() force-closes all BDSs with a BlockBackend,
>> which can lead to data corruption (see the iotest added in the final
>> patch of this series) and is most certainly very ugly.
>>
>> This series reworks bdrv_close_all() to instead eject the BDS trees from
>> all BlockBackends and then close the monitor-owned BDS trees, which are
>> the only BDSs without a BB. In effect, all BDSs are closed just by
>> getting closed automatically due to their reference count becoming 0.
>>
>> The benefit over the approach taken in v1 and v2 is that in device
>> models we often cannot simply drop the reference to a BB because there
>> may be some user which we forgot about. By ejecting the BDS trees from
>> the BB, the BB itself becomes unusable, but in a clean way (it will
>> return errors when accessed, but nothing will crash). Also, it is much
>> simpler (no reference tracking necessary).
>>
>> The only disadvantage (I can see) is that the BBs are leaked; but this
>> does not matter because the qemu process is about to exit anyway.
> I haven't looked at the actual patches yet, but just from this
> description and the diffstat: We need to make sure that the refcount
> really drops to 0.

If you mean the BBs: Tried that in v2, doesn't seem to work. I had my 
fun tracing around where the handles to the BBs for device models stay 
and who might have access to them, but when I say "fun" I mean that 
ironically.

If you mean the BDSs: See below (below below).

> That is, if there are NBD servers, block jobs, etc.
> that hold an additional reference, we must make sure to stop them. It
> doesn't look like this series takes care of this, does it?

Everyone using BBs is fine; for instance, NBD servers are stopped (they 
register a notifier for when the BDS tree is ejected from a BB).

So block jobs are not handled, once because I still didn't get around to 
make them work on BBs instead of BDSs (and I probably never will, 
although they really should), and because I missed the bdrv_ref() in 
block_job_create()

I guess that means manually cancelling all block jobs in bdrv_close_all()...

> Hm... Perhaps we could even install an atexit handler that asserts that
> all BDSes are really gone in the end?

I had that for BBs in v1 and v2, it was just a function that was called 
at the end of bdrv_close_all(). For that to work for BDSs, however, we'd 
need a list of all BDSs and assert that it's empty. I found that a bit 
too much.

A simpler but uglier way would be a counter that's incremented every 
time a BDS is created and decremented every time one is deleted (or 
incremented once per refcount increment and drecrement once per refcount 
decrement). We'd then assert that this counter is 0.

Max

  reply	other threads:[~2015-03-02 15:15 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-27 16:43 [Qemu-devel] [PATCH v4 00/11] block: Rework bdrv_close_all() Max Reitz
2015-02-27 16:43 ` [Qemu-devel] [PATCH v4 01/11] iotests: Move _filter_nbd into common.filter Max Reitz
2015-02-27 16:43 ` [Qemu-devel] [PATCH v4 02/11] iotests: Make redirecting qemu's stderr optional Max Reitz
2015-02-27 16:43 ` [Qemu-devel] [PATCH v4 03/11] iotests: Add test for eject under NBD server Max Reitz
2015-02-27 16:43 ` [Qemu-devel] [PATCH v4 04/11] quorum: Fix close path Max Reitz
2015-02-27 16:43 ` [Qemu-devel] [PATCH v4 05/11] block: Move BDS close notifiers into BB Max Reitz
2015-02-27 20:08   ` Max Reitz
2015-02-28  2:55   ` Fam Zheng
2015-03-02 15:18     ` Max Reitz
2015-03-03  2:08       ` Fam Zheng
2015-02-27 16:43 ` [Qemu-devel] [PATCH v4 06/11] block: Use blk_remove_bs() in blk_delete() Max Reitz
2015-02-27 16:43 ` [Qemu-devel] [PATCH v4 07/11] blockdev: Use blk_remove_bs() in do_drive_del() Max Reitz
2015-02-27 16:43 ` [Qemu-devel] [PATCH v4 08/11] block: Make bdrv_close() static Max Reitz
2015-02-27 16:43 ` [Qemu-devel] [PATCH v4 09/11] blockdev: Keep track of monitor-owned BDS Max Reitz
2015-02-27 16:43 ` [Qemu-devel] [PATCH v4 10/11] block: Eject BDS tree from BB at bdrv_close_all() Max Reitz
2015-02-27 16:44 ` [Qemu-devel] [PATCH v4 11/11] iotests: Add test for multiple BB on BDS tree Max Reitz
2015-03-02  9:25 ` [Qemu-devel] [PATCH v4 00/11] block: Rework bdrv_close_all() Kevin Wolf
2015-03-02 15:15   ` Max Reitz [this message]
2015-03-02 15:57     ` Kevin Wolf
2015-03-02 16:03       ` Max Reitz

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=54F47E77.6000007@redhat.com \
    --to=mreitz@redhat.com \
    --cc=armbru@redhat.com \
    --cc=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@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).