All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, stefanha@redhat.com, famz@redhat.com,
	qemu-block@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/3] block: change drain to look only at one child at a time
Date: Mon, 10 Oct 2016 13:17:44 +0200	[thread overview]
Message-ID: <20161010111744.GE6775@noname.redhat.com> (raw)
In-Reply-To: <1475857193-28735-3-git-send-email-pbonzini@redhat.com>

Am 07.10.2016 um 18:19 hat Paolo Bonzini geschrieben:
> bdrv_requests_pending is checking children to also wait until internal
> requests (such as metadata writes) have completed.  However, checking
> children is in general overkill.  Children requests can be of two kinds:
> 
> - requests caused by an operation on bs, e.g. a bdrv_aio_write to bs
> causing a write to bs->file->bs.  In this case, the parent's in_flight
> count will always be incremented by at least one for every request in
> the child.

What about node with multiple parents? The in_flight count will be
incremented for one of the parents, but is this good enough if we want
to drain the other one?

Actually, I don't think we ever bothered to consciously define what a
drain operation does, i.e. if only the requests on a single node are
drained or all nodes below it, too. Currently it is implemented
recursively and this is what the bdrv_drain() comment says, too:

 * Wait for pending requests to complete on a single BlockDriverState subtree,
 * and suspend block driver's internal I/O until next request arrives.

If we want to keep the operation defined for the whole subtree, your
assumption made here is wrong. If we want to change it, we need to audit
all callers and check if they need to recurse themselves now.

> - asynchronous metadata writes or flushes.  Such writes can be started
> even if bs's in_flight count is zero, but not after the .bdrv_drain
> callback has been invoked.

I don't think it actually makes a difference for the code, but this
could be data as well (imagine a writeback cache implemented in qemu as
I proposed to do in order to mitigate COW perfomance hits in qcow2).

> This patch therefore changes bdrv_drain to finish I/O in the parent
> (after which the parent's in_flight will be locked to zero), call
> bdrv_drain (after which the parent will not generate I/O on the child
> anymore), and then wait for internal I/O in the children to complete.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

However, it seems the only way in which you rely on the wrong assumption
is where the old code assumed the same. We should be calling the
BdrvChild .drained_begin/end callbacks for the children, with or without
this patch, so this is a preexisting bug.

Kevin

  reply	other threads:[~2016-10-10 11:17 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-07 16:19 [Qemu-devel] [PATCH 0/3] block: new bdrv_drain implementation Paolo Bonzini
2016-10-07 16:19 ` [Qemu-devel] [PATCH 1/3] block: add BDS field to count in-flight requests Paolo Bonzini
2016-10-10 10:36   ` Kevin Wolf
2016-10-10 16:37     ` Paolo Bonzini
2016-10-11 11:00       ` Kevin Wolf
2016-10-11 14:09         ` Paolo Bonzini
2016-10-11 15:25           ` Kevin Wolf
2016-10-11 16:45             ` Paolo Bonzini
2016-10-12  9:50               ` Kevin Wolf
2016-10-12 10:13                 ` Paolo Bonzini
2016-10-07 16:19 ` [Qemu-devel] [PATCH 2/3] block: change drain to look only at one child at a time Paolo Bonzini
2016-10-10 11:17   ` Kevin Wolf [this message]
2016-10-07 16:19 ` [Qemu-devel] [PATCH 3/3] qed: Implement .bdrv_drain Paolo Bonzini
2016-10-11 16:46 ` [Qemu-devel] [PATCH 0/3] block: new bdrv_drain implementation no-reply

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=20161010111744.GE6775@noname.redhat.com \
    --to=kwolf@redhat.com \
    --cc=famz@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.