From: Paolo Bonzini <pbonzini@redhat.com>
To: Ming Lei <ming.lei@canonical.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
Peter Maydell <peter.maydell@linaro.org>,
Fam Zheng <famz@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
qemu-devel <qemu-devel@nongnu.org>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 09/15] linux-aio: fix submit aio as a batch
Date: Thu, 31 Jul 2014 01:41:03 +0200 [thread overview]
Message-ID: <53D9828F.9040208@redhat.com> (raw)
In-Reply-To: <CACVXFVO00u3P0Xz7E5cN1kOgR3FSvEAB4W75pfWv9OHj=Y+vbQ@mail.gmail.com>
Il 30/07/2014 19:32, Ming Lei ha scritto:
> On Wed, Jul 30, 2014 at 9:59 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
>> Il 30/07/2014 13:39, Ming Lei ha scritto:
>>> In the enqueue path, we can't complete request, otherwise
>>> "Co-routine re-entered recursively" may be caused, so this
>>> patch fixes the issue with below ideas:
>>>
>>> - for -EAGAIN or partial completion, retry the submission by
>>> an introduced event handler
>>> - for part of completion, also update the io queue
>>> - for other failure, return the failure if in enqueue path,
>>> otherwise, abort all queued I/O
>>>
>>> Signed-off-by: Ming Lei <ming.lei@canonical.com>
>>> ---
>>> block/linux-aio.c | 90 ++++++++++++++++++++++++++++++++++++++++-------------
>>> 1 file changed, 68 insertions(+), 22 deletions(-)
>>>
>>> diff --git a/block/linux-aio.c b/block/linux-aio.c
>>> index 7ac7e8c..5eb9c92 100644
>>> --- a/block/linux-aio.c
>>> +++ b/block/linux-aio.c
>>> @@ -51,6 +51,7 @@ struct qemu_laio_state {
>>>
>>> /* io queue for submit at batch */
>>> LaioQueue io_q;
>>> + EventNotifier retry; /* handle -EAGAIN and partial completion */
>>> };
>>>
>>> static inline ssize_t io_event_ret(struct io_event *ev)
>>> @@ -154,45 +155,80 @@ static void ioq_init(LaioQueue *io_q)
>>> io_q->plugged = 0;
>>> }
>>>
>>> -static int ioq_submit(struct qemu_laio_state *s)
>>> +static void abort_queue(struct qemu_laio_state *s)
>>> +{
>>> + int i;
>>> + for (i = 0; i < s->io_q.idx; i++) {
>>> + struct qemu_laiocb *laiocb = container_of(s->io_q.iocbs[i],
>>> + struct qemu_laiocb,
>>> + iocb);
>>> + laiocb->ret = -EIO;
>>> + qemu_laio_process_completion(s, laiocb);
>>> + }
>>> +}
>>> +
>>> +static int ioq_submit(struct qemu_laio_state *s, bool enqueue)
>>> {
>>> int ret, i = 0;
>>> int len = s->io_q.idx;
>>> + int j = 0;
>>>
>>> - do {
>>> - ret = io_submit(s->ctx, len, s->io_q.iocbs);
>>> - } while (i++ < 3 && ret == -EAGAIN);
>>> + if (!len) {
>>> + return 0;
>>> + }
>>>
>>> - /* empty io queue */
>>> - s->io_q.idx = 0;
>>> + ret = io_submit(s->ctx, len, s->io_q.iocbs);
>>> + if (ret == -EAGAIN) {
>>> + event_notifier_set(&s->retry);
>>
>> Retrying immediately (and just doing a couple of system calls to waste
>> time) is not an improvement. The right place to retry is in
>> qemu_laio_completion_cb, after io_getevents has been called and
>> presumably the queue depth has decreased.
>
> Good point.
>
>>
>> If !s->io_q.plugged but io_submit fails you can call ioq_enqueue and it
>
> When will the queued I/O be submitted? That will introduce extra
> complexity definitely.
It will be submitted when qemu_laio_completion_cb is called.
> It is a change for !s->io_q.plugged case, and it isn't good to do that in
> this patch, IMO.
I agree with you that this series is doing too many things at a single
time. You can submit separate series for 1) no-coroutine fast path, 2)
full queue, 3) multiqueue. If you do things properly you won't have a
single conflict, since they affect respectively block.c,
block/linux-aio.c and hw/block/.
Paolo
next prev parent reply other threads:[~2014-07-30 23:41 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-30 11:39 [Qemu-devel] [PATCH 00/14] dataplane: optimization and multi virtqueue support Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 01/15] qemu coroutine: support bypass mode Ming Lei
2014-07-30 13:45 ` Paolo Bonzini
2014-07-30 17:15 ` Ming Lei
2014-07-30 23:37 ` Paolo Bonzini
2014-07-31 3:55 ` Ming Lei
2014-07-31 7:37 ` Benoît Canet
2014-07-31 9:47 ` Ming Lei
2014-07-31 10:45 ` Paolo Bonzini
2014-08-01 13:38 ` Ming Lei
2014-07-31 8:59 ` Ming Lei
2014-07-31 9:15 ` Paolo Bonzini
2014-07-31 10:06 ` Ming Lei
2014-07-31 16:13 ` Ming Lei
2014-07-31 16:30 ` Paolo Bonzini
2014-08-01 2:54 ` Ming Lei
2014-08-01 13:13 ` Stefan Hajnoczi
2014-08-01 13:48 ` Ming Lei
2014-08-01 14:17 ` Paolo Bonzini
2014-08-01 15:21 ` Ming Lei
2014-08-01 14:52 ` Ming Lei
2014-08-01 16:03 ` Stefan Hajnoczi
2014-08-02 2:42 ` Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 02/15] qemu aio: prepare for supporting selective bypass coroutine Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 03/15] block: support to bypass qemu coroutinue Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 04/15] Revert "raw-posix: drop raw_get_aio_fd() since it is no longer used" Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 05/15] dataplane: enable selective bypassing coroutine Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 06/15] qemu/obj_pool.h: introduce object allocation pool Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 07/15] dataplane: use object pool to speed up allocation for virtio blk request Ming Lei
2014-07-30 14:14 ` Paolo Bonzini
2014-07-30 15:09 ` Michael S. Tsirkin
2014-07-31 3:22 ` Ming Lei
2014-07-31 9:18 ` Paolo Bonzini
2014-08-01 7:42 ` Ming Lei
2014-08-04 10:21 ` Stefan Hajnoczi
2014-08-04 11:42 ` Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 08/15] virtio: decrease size of VirtQueueElement Ming Lei
2014-07-30 13:51 ` Paolo Bonzini
2014-07-30 14:40 ` Michael S. Tsirkin
2014-07-30 14:50 ` Paolo Bonzini
2014-07-31 2:11 ` Ming Lei
2014-07-31 2:07 ` Ming Lei
2014-07-31 9:38 ` Paolo Bonzini
2014-08-01 3:34 ` Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 09/15] linux-aio: fix submit aio as a batch Ming Lei
2014-07-30 13:59 ` Paolo Bonzini
2014-07-30 17:32 ` Ming Lei
2014-07-30 23:41 ` Paolo Bonzini [this message]
2014-07-30 11:39 ` [Qemu-devel] [PATCH 10/15] linux-aio: increase max event to 256 Ming Lei
2014-07-30 12:15 ` Eric Blake
2014-07-30 14:00 ` Paolo Bonzini
2014-07-30 17:20 ` Ming Lei
2014-08-04 10:26 ` Stefan Hajnoczi
2014-07-30 11:39 ` [Qemu-devel] [PATCH 11/15] linux-aio: remove 'node' from 'struct qemu_laiocb' Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 12/15] hw/virtio-pci: introduce num_queues property Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 13/15] hw/virtio/virtio-blk.h: introduce VIRTIO_BLK_F_MQ Ming Lei
2014-07-30 11:39 ` [Qemu-devel] [PATCH 14/15] hw/block/virtio-blk: create num_queues vqs if dataplane is enabled Ming Lei
2014-07-30 14:01 ` Paolo Bonzini
2014-07-30 15:12 ` Michael S. Tsirkin
2014-07-30 15:25 ` Paolo Bonzini
2014-07-31 3:47 ` Ming Lei
2014-07-31 8:52 ` Paolo Bonzini
2014-08-01 3:09 ` Ming Lei
2014-08-01 3:24 ` Ming Lei
2014-08-01 6:10 ` Paolo Bonzini
2014-08-01 7:35 ` Ming Lei
2014-08-01 7:46 ` Paolo Bonzini
2014-07-30 11:39 ` [Qemu-devel] [PATCH 15/15] dataplane: virtio-blk: support mutlti virtqueue Ming Lei
2014-07-30 12:42 ` [Qemu-devel] [PATCH 00/14] dataplane: optimization and multi virtqueue support Christian Borntraeger
2014-08-04 10:16 ` Stefan Hajnoczi
2014-08-04 10:45 ` Ming Lei
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=53D9828F.9040208@redhat.com \
--to=pbonzini@redhat.com \
--cc=famz@redhat.com \
--cc=kwolf@redhat.com \
--cc=ming.lei@canonical.com \
--cc=mst@redhat.com \
--cc=peter.maydell@linaro.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).