From: Alexander Yarygin <yarygin@linux.vnet.ibm.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,
qemu-block@nongnu.org, "Michael S. Tsirkin" <mst@redhat.com>,
Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>,
qemu-devel@nongnu.org,
Christian Borntraeger <borntraeger@de.ibm.com>,
Stefan Hajnoczi <stefanha@redhat.com>,
Cornelia Huck <cornelia.huck@de.ibm.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v3 2/2] virtio-blk: Use blk_drain() to drain IO requests
Date: Fri, 26 Jun 2015 17:00:31 +0300 [thread overview]
Message-ID: <87egky4lj4.fsf@linux.vnet.ibm.com> (raw)
In-Reply-To: <87mvzm2536.fsf@blackfin.pond.sub.org> (Markus Armbruster's message of "Fri, 26 Jun 2015 11:26:21 +0200")
Markus Armbruster <armbru@redhat.com> writes:
> Just spotted this in my git-pull...
>
> Alexander Yarygin <yarygin@linux.vnet.ibm.com> writes:
>
>> Each call of the virtio_blk_reset() function calls blk_drain_all(),
>> which works for all existing BlockDriverStates, while draining only
>> one is needed.
>>
>> This patch replaces blk_drain_all() by blk_drain() in
>> virtio_blk_reset(). virtio_blk_data_plane_stop() should be called
>> after draining because it restores vblk->complete_request.
>>
>> Cc: "Michael S. Tsirkin" <mst@redhat.com>
>> Cc: Christian Borntraeger <borntraeger@de.ibm.com>
>> Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
>> Cc: Kevin Wolf <kwolf@redhat.com>
>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>> Cc: Stefan Hajnoczi <stefanha@redhat.com>
>> Signed-off-by: Alexander Yarygin <yarygin@linux.vnet.ibm.com>
>> ---
>> hw/block/virtio-blk.c | 15 ++++++++++-----
>> 1 file changed, 10 insertions(+), 5 deletions(-)
>>
>> diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
>> index e6afe97..d8a906f 100644
>> --- a/hw/block/virtio-blk.c
>> +++ b/hw/block/virtio-blk.c
>> @@ -651,16 +651,21 @@ static void virtio_blk_dma_restart_cb(void *opaque, int running,
>> static void virtio_blk_reset(VirtIODevice *vdev)
>> {
>> VirtIOBlock *s = VIRTIO_BLK(vdev);
>> -
>> - if (s->dataplane) {
>> - virtio_blk_data_plane_stop(s->dataplane);
>> - }
>> + AioContext *ctx;
>>
>> /*
>> * This should cancel pending requests, but can't do nicely until there
>> * are per-device request lists.
>> */
>> - blk_drain_all();
>> + ctx = blk_get_aio_context(s->blk);
>> + aio_context_acquire(ctx);
>> + blk_drain(s->blk);
>> +
>> + if (s->dataplane) {
>> + virtio_blk_data_plane_stop(s->dataplane);
>> + }
>> + aio_context_release(ctx);
>> +
>> blk_set_enable_write_cache(s->blk, s->original_wce);
>> }
>
> From bdrv_drain_all()'s comment:
>
> * Note that completion of an asynchronous I/O operation can trigger any
> * number of other I/O operations on other devices---for example a coroutine
> * can be arbitrarily complex and a constant flow of I/O can come until the
> * coroutine is complete. Because of this, it is not possible to have a
> * function to drain a single device's I/O queue.
>
> From bdrv_drain()'s comment:
>
> * See the warning in bdrv_drain_all(). This function can only be called if
> * you are sure nothing can generate I/O because you have op blockers
> * installed.
>
> blk_drain() and blk_drain_all() are trivial wrappers.
>
> Ignorant questions:
>
> * Why does blk_drain() suffice here?
>
> * Is blk_drain() (created in PATCH 1) even a safe interface?
* We want to drain requests from only one bdrv and blk_drain() can do
that.
* Ignorant answer: I was told that the bdrv_drain_all()'s comment is
obsolete and we can use bdrv_drain(). Here is a link to the old
thread: http://marc.info/?l=qemu-devel&m=143154211017926&w=2. Since I
don't see the full picture of this area yet, I'm just relying on other
people's opinion.
next prev parent reply other threads:[~2015-06-26 14:00 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-17 10:37 [Qemu-devel] [PATCH v3 0/2] Fix slow startup with many disks Alexander Yarygin
2015-06-17 10:37 ` [Qemu-devel] [PATCH v3 1/2] block-backend: Introduce blk_drain() Alexander Yarygin
2015-06-17 10:37 ` [Qemu-devel] [PATCH v3 2/2] virtio-blk: Use blk_drain() to drain IO requests Alexander Yarygin
2015-06-26 9:26 ` Markus Armbruster
2015-06-26 14:00 ` Alexander Yarygin [this message]
2015-06-29 6:10 ` Markus Armbruster
2015-06-30 13:52 ` Stefan Hajnoczi
2015-07-01 15:52 ` Markus Armbruster
2015-07-02 8:21 ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2015-06-18 15:53 ` [Qemu-devel] [PATCH v3 0/2] Fix slow startup with many disks Stefan Hajnoczi
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=87egky4lj4.fsf@linux.vnet.ibm.com \
--to=yarygin@linux.vnet.ibm.com \
--cc=armbru@redhat.com \
--cc=borntraeger@de.ibm.com \
--cc=cornelia.huck@de.ibm.com \
--cc=famz@redhat.com \
--cc=kwolf@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=tumanova@linux.vnet.ibm.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.