From: Kevin Wolf <kwolf@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: Fam Zheng <famz@redhat.com>,
qemu-block@nongnu.org, jcody@redhat.com, qemu-devel@nongnu.org,
armbru@redhat.com, Stefan Hajnoczi <stefanha@redhat.com>,
amit.shah@redhat.com, pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH v6 01/13] block: Add op blocker type "device IO"
Date: Wed, 27 May 2015 11:07:45 +0200 [thread overview]
Message-ID: <20150527090745.GA4669@noname.str.redhat.com> (raw)
In-Reply-To: <55648220.1030206@redhat.com>
Am 26.05.2015 um 16:24 hat Max Reitz geschrieben:
> On 26.05.2015 16:22, Kevin Wolf wrote:
> >Am 21.05.2015 um 08:42 hat Fam Zheng geschrieben:
> >>It blocks device IO.
> >What I'm missing here is a description of the case that it protects
> >against. Blocking device I/O doesn't sound like a valid thing to want
> >per se, but it might be true that we need it as long as we don't have
> >the "real" op blockers that Jeff is working on. However, as long as you
> >don't say why you want that, I can't say whether it's true or not.
> >
> >And of course, it doesn't block anything yet after this patch, it's just
> >set or cleared without any effect. In fact, it seems that even at the
> >end of the series, there is no bdrv_op_is_blocked() call that checks for
> >BLOCK_OP_TYPE_DEVICE_IO. Is this intentional?
>
> Probably yes, because patches 2 and 3 introduce a notifier for when
> op blockers are set up and removed. This is used by virtio-blk and
> virtio-scsi to pause and unpause device I/O, respectively.
Indeed, I missed that.
Having thought a bit more about this, I think we need to carefully check
whether op blockers are really the right tool here; and if they are, we
need to document the reason in the commit message at least.
The op blocker model as used until now has a few characteristics:
* Old model: You have a period of time between blocking and unblocking
during which starting the corresponding operation is prohibited. The
operation checks whether the blocker is set when it starts, and it
fails if the operation is blocked.
New model that Jeff is working on: You still have block/unblock (for a
category rather than a specific operation, though), but you also have
a start/stop pair for using the functionality. If you start an
operation that is blocked, it still errors out. However, blocking an
operation that is already started fails as well now.
This series: An already running operation is interrupted when the
blocker is set, and it continues when it is removed. You had to
introduce new infrastructure (notifiers) because this doesn't match
the op blockers model.
* Op blockers used to be set to protect high-level, long-running
background operations, that are usually initiated by the user.
bdrv_drain() is low-level and a blocking foreground operation.
* Op blockers came into effect only after monitor interactions and used
to be on a slow path. We're now in the I/O path. It's not a problem
with the current code per se (as you introduced notifiers, so we don't
have to iterate the list all the time), but it broadens the scope of
op blockers significantly and we shouldn't be doing that carelessly.
* Op blockers have an error message. It's unused for the new case.
This is the first part of what's troubling me with this series, as it
makes me doubtful if op blockers are the right tool to implement what
the commit message says (block device I/O). This is "are we doing the
thing right?"
The second part should actually come first, though: "Are we doing the
right thing?" I'm also doubtful whether blocking device I/O is even what
we should do.
Why is device I/O special compared to block job I/O or NBD server I/O?
If the answer is "because block jobs are already paused while draining"
(and probably nobody thought much about the NBD server), then chances
are that it's not the right thing. In fact, using two different
mechanisms for pausing block jobs and pausing device I/O seems
inconsistent and wrong.
I suspect that the real solution needs to be in the block layer, though
I'm not quite sure yet what it would be like. Perhaps a function pair
like blk_stop/resume_io() that is used by bdrv_drain() callers and works
on the BlockBackend level. (The BDS level is problematic because we
don't want to stop all I/O; many callers just want to drain I/O of
_other_ callers so they can do their own I/O without having to care
about concurrency).
Kevin
next prev parent reply other threads:[~2015-05-27 9:08 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-21 6:42 [Qemu-devel] [PATCH v6 00/13] Fix transactional snapshot with dataplane and NBD export Fam Zheng
2015-05-21 6:42 ` [Qemu-devel] [PATCH v6 01/13] block: Add op blocker type "device IO" Fam Zheng
2015-05-21 7:06 ` Wen Congyang
2015-05-21 7:32 ` Fam Zheng
2015-05-22 4:54 ` Fam Zheng
2015-05-23 16:51 ` Max Reitz
2015-05-25 2:15 ` Fam Zheng
2015-05-21 8:00 ` Wen Congyang
2015-05-21 12:44 ` Fam Zheng
2015-05-22 6:18 ` Wen Congyang
2015-05-26 14:22 ` Kevin Wolf
2015-05-26 14:24 ` Max Reitz
2015-05-27 9:07 ` Kevin Wolf [this message]
2015-05-27 9:50 ` Paolo Bonzini
2015-05-27 10:10 ` Kevin Wolf
2015-05-27 10:43 ` Paolo Bonzini
2015-05-28 2:49 ` Fam Zheng
2015-05-28 8:23 ` Paolo Bonzini
2015-05-28 10:46 ` Fam Zheng
2015-05-28 10:52 ` Paolo Bonzini
2015-05-28 11:11 ` Fam Zheng
2015-05-28 11:19 ` Paolo Bonzini
2015-05-28 12:05 ` Fam Zheng
2015-05-29 11:11 ` Andrey Korolyov
2015-05-30 13:21 ` Paolo Bonzini
2015-05-28 9:40 ` Kevin Wolf
2015-05-28 10:55 ` Fam Zheng
2015-05-28 11:00 ` Paolo Bonzini
2015-05-28 11:24 ` Kevin Wolf
2015-05-28 11:41 ` Paolo Bonzini
2015-05-28 11:44 ` Fam Zheng
2015-05-28 11:47 ` Paolo Bonzini
2015-05-28 12:04 ` Fam Zheng
2015-05-21 6:42 ` [Qemu-devel] [PATCH v6 02/13] block: Add op blocker notifier list Fam Zheng
2015-05-21 6:42 ` [Qemu-devel] [PATCH v6 03/13] block-backend: Add blk_op_blocker_add_notifier Fam Zheng
2015-05-21 6:42 ` [Qemu-devel] [PATCH v6 04/13] virtio-blk: Move complete_request to 'ops' structure Fam Zheng
2015-05-21 6:42 ` [Qemu-devel] [PATCH v6 05/13] virtio-blk: Don't handle output when there is "device IO" op blocker Fam Zheng
2015-05-23 16:53 ` Max Reitz
2015-05-21 6:42 ` [Qemu-devel] [PATCH v6 06/13] virtio-scsi-dataplane: Add "device IO" op blocker listener Fam Zheng
2015-05-23 16:53 ` Max Reitz
2015-05-21 6:42 ` [Qemu-devel] [PATCH v6 07/13] nbd-server: Clear "can_read" when "device io" blocker is set Fam Zheng
2015-05-23 16:54 ` Max Reitz
2015-05-21 6:42 ` [Qemu-devel] [PATCH v6 08/13] blockdev: Block device IO during internal snapshot transaction Fam Zheng
2015-05-23 16:56 ` Max Reitz
2015-05-21 6:42 ` [Qemu-devel] [PATCH v6 09/13] blockdev: Block device IO during external " Fam Zheng
2015-05-23 16:58 ` Max Reitz
2015-05-21 6:43 ` [Qemu-devel] [PATCH v6 10/13] blockdev: Block device IO during drive-backup transaction Fam Zheng
2015-05-23 16:59 ` Max Reitz
2015-05-21 6:43 ` [Qemu-devel] [PATCH v6 11/13] blockdev: Block device IO during blockdev-backup transaction Fam Zheng
2015-05-23 17:05 ` Max Reitz
2015-05-21 6:43 ` [Qemu-devel] [PATCH v6 12/13] block: Block "device IO" during bdrv_drain and bdrv_drain_all Fam Zheng
2015-05-23 17:11 ` Max Reitz
2015-05-25 2:48 ` Fam Zheng
2015-05-26 14:21 ` Max Reitz
2015-05-21 6:43 ` [Qemu-devel] [PATCH v6 13/13] block/mirror: Block "device IO" during mirror exit Fam Zheng
2015-05-23 17:21 ` 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=20150527090745.GA4669@noname.str.redhat.com \
--to=kwolf@redhat.com \
--cc=amit.shah@redhat.com \
--cc=armbru@redhat.com \
--cc=famz@redhat.com \
--cc=jcody@redhat.com \
--cc=mreitz@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).