From: Paolo Bonzini <pbonzini@redhat.com>
To: Ming Lei <ming.lei@canonical.com>,
Peter Maydell <peter.maydell@linaro.org>,
qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 2/2] virtio-blk: dataplane: notify guest as a batch
Date: Fri, 04 Jul 2014 14:55:04 +0200 [thread overview]
Message-ID: <53B6A428.7030800@redhat.com> (raw)
In-Reply-To: <1404476854-23773-3-git-send-email-ming.lei@canonical.com>
Il 04/07/2014 14:27, Ming Lei ha scritto:
> Now requests are submitted as a batch, so it is natural
> to notify guest as a batch too.
>
> This may supress interrupt notification to VM:
>
> - in my test, decreased by ~13K/sec
I don't think this can work. Requests are not completed FIFO.
What you can do is change notify_guest to something like
qemu_bh_schedule(req->dev->dataplane->notify_guest_bh);
and do the actual notification in the bottom half. This should ensure
that multiple notifications are coalesced, but it may also introduce new
aio_notify calls even with my patch (a BH scheduled from a BH currently
does an aio_notify; this can be fixed).
Paolo
> Signed-off-by: Ming Lei <ming.lei@canonical.com>
> ---
> hw/block/dataplane/virtio-blk.c | 13 ++++++++++++-
> hw/block/virtio-blk.c | 1 +
> include/hw/virtio/virtio-blk.h | 1 +
> 3 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c
> index e88862d..9d36659 100644
> --- a/hw/block/dataplane/virtio-blk.c
> +++ b/hw/block/dataplane/virtio-blk.c
> @@ -45,6 +45,8 @@ struct VirtIOBlockDataPlane {
> AioContext *ctx;
> EventNotifier host_notifier; /* doorbell */
>
> + VirtIOBlockReq *last_submit;
> +
> /* Operation blocker on BDS */
> Error *blocker;
> void (*saved_complete_request)(struct VirtIOBlockReq *req,
> @@ -67,7 +69,10 @@ static void complete_request_vring(VirtIOBlockReq *req, unsigned char status)
>
> vring_push(&req->dev->dataplane->vring, &req->elem,
> req->qiov.size + sizeof(*req->in));
> - notify_guest(req->dev->dataplane);
> +
> + if (req->last) {
> + notify_guest(req->dev->dataplane);
> + }
> }
>
> static void handle_notify(EventNotifier *e)
> @@ -101,6 +106,8 @@ static void handle_notify(EventNotifier *e)
> req->elem.index);
>
> virtio_blk_handle_request(req, &mrb);
> +
> + s->last_submit = req;
> }
>
> virtio_submit_multiwrite(s->blk->conf.bs, &mrb);
> @@ -116,6 +123,10 @@ static void handle_notify(EventNotifier *e)
> break;
> }
> }
> +
> + if (s->last_submit) {
> + s->last_submit->last = true;
> + }
> bdrv_io_unplug(s->blk->conf.bs);
> }
>
> diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
> index 02cd6b0..86b37f7 100644
> --- a/hw/block/virtio-blk.c
> +++ b/hw/block/virtio-blk.c
> @@ -35,6 +35,7 @@ VirtIOBlockReq *virtio_blk_alloc_request(VirtIOBlock *s)
> req->dev = s;
> req->qiov.size = 0;
> req->next = NULL;
> + req->last = false;
> return req;
> }
>
> diff --git a/include/hw/virtio/virtio-blk.h b/include/hw/virtio/virtio-blk.h
> index 992da26..07659c3 100644
> --- a/include/hw/virtio/virtio-blk.h
> +++ b/include/hw/virtio/virtio-blk.h
> @@ -150,6 +150,7 @@ typedef struct VirtIOBlockReq {
> QEMUIOVector qiov;
> struct VirtIOBlockReq *next;
> BlockAcctCookie acct;
> + bool last;
> } VirtIOBlockReq;
>
> #define DEFINE_VIRTIO_BLK_FEATURES(_state, _field) \
>
next prev parent reply other threads:[~2014-07-04 12:55 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-04 12:27 [Qemu-devel] [PATCH 0/2] virtio-blk: dataplane: one fix plus one optimization Ming Lei
2014-07-04 12:27 ` [Qemu-devel] [PATCH 1/2] virtio-blk: data-plane: fix save/set .complete_request in start Ming Lei
2014-07-04 12:27 ` [Qemu-devel] [PATCH 2/2] virtio-blk: dataplane: notify guest as a batch Ming Lei
2014-07-04 12:55 ` Paolo Bonzini [this message]
2014-07-04 14:52 ` Ming Lei
2014-07-04 15:48 ` Paolo Bonzini
2014-07-04 15:57 ` Ming Lei
2014-07-04 16:09 ` Paolo Bonzini
2014-07-05 4:21 ` 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=53B6A428.7030800@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 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.