From: "Michael S. Tsirkin" <mst@redhat.com>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: Christoph Hellwig <hch@infradead.org>,
virtualization <virtualization@lists.linux-foundation.org>,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
mst@redhat.com
Subject: Re: [PATCH 5 of 5] virtio: expose added descriptors immediately
Date: Sun, 13 Nov 2011 23:03:14 +0200 [thread overview]
Message-ID: <20111113210256.GA31621@redhat.com> (raw)
In-Reply-To: <f3831c1617c86a51d875.1320306173@localhost6.localdomain6>
On Thu, Nov 03, 2011 at 06:12:53PM +1030, Rusty Russell wrote:
> A virtio driver does virtqueue_add_buf() multiple times before finally
> calling virtqueue_kick(); previously we only exposed the added buffers
> in the virtqueue_kick() call. This means we don't need a memory
> barrier in virtqueue_add_buf(), but it reduces concurrency as the
> device (ie. host) can't see the buffers until the kick.
>
> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
In the past I played with a patch like this, but I didn't see a
performance gain either way. Do you see any gain?
I'm a bit concerned that with this patch, a buggy driver that
adds more than 2^16 descriptors without a kick
would seem to work sometimes. Let's add WARN_ON(vq->num_added > (1 << 16))?
> ---
> drivers/virtio/virtio_ring.c | 37 ++++++++++++++++++++++---------------
> 1 file changed, 22 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -227,9 +227,15 @@ add_head:
>
> /* Put entry in available array (but don't update avail->idx until they
> * do sync). */
> - avail = ((vq->vring.avail->idx + vq->num_added++) & (vq->vring.num-1));
> + avail = (vq->vring.avail->idx & (vq->vring.num-1));
> vq->vring.avail->ring[avail] = head;
>
> + /* Descriptors and available array need to be set before we expose the
> + * new available array entries. */
> + virtio_wmb();
> + vq->vring.avail->idx++;
> + vq->num_added++;
> +
> pr_debug("Added buffer head %i to %p\n", head, vq);
> END_USE(vq);
>
> @@ -248,13 +254,10 @@ bool virtqueue_kick_prepare(struct virtq
> * new available array entries. */
> virtio_wmb();
>
> - old = vq->vring.avail->idx;
> - new = vq->vring.avail->idx = old + vq->num_added;
> + old = vq->vring.avail->idx - vq->num_added;
> + new = vq->vring.avail->idx;
> vq->num_added = 0;
>
> - /* Need to update avail index before checking if we should notify */
> - virtio_mb();
> -
> if (vq->event) {
> needs_kick = vring_need_event(vring_avail_event(&vq->vring),
> new, old);
>
>
> _______________________________________________
> Virtualization mailing list
> Virtualization@lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/virtualization
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: mst@redhat.com, Christoph Hellwig <hch@infradead.org>,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
virtualization <virtualization@lists.linux-foundation.org>
Subject: Re: [PATCH 5 of 5] virtio: expose added descriptors immediately
Date: Sun, 13 Nov 2011 23:03:14 +0200 [thread overview]
Message-ID: <20111113210256.GA31621@redhat.com> (raw)
In-Reply-To: <f3831c1617c86a51d875.1320306173@localhost6.localdomain6>
On Thu, Nov 03, 2011 at 06:12:53PM +1030, Rusty Russell wrote:
> A virtio driver does virtqueue_add_buf() multiple times before finally
> calling virtqueue_kick(); previously we only exposed the added buffers
> in the virtqueue_kick() call. This means we don't need a memory
> barrier in virtqueue_add_buf(), but it reduces concurrency as the
> device (ie. host) can't see the buffers until the kick.
>
> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
In the past I played with a patch like this, but I didn't see a
performance gain either way. Do you see any gain?
I'm a bit concerned that with this patch, a buggy driver that
adds more than 2^16 descriptors without a kick
would seem to work sometimes. Let's add WARN_ON(vq->num_added > (1 << 16))?
> ---
> drivers/virtio/virtio_ring.c | 37 ++++++++++++++++++++++---------------
> 1 file changed, 22 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -227,9 +227,15 @@ add_head:
>
> /* Put entry in available array (but don't update avail->idx until they
> * do sync). */
> - avail = ((vq->vring.avail->idx + vq->num_added++) & (vq->vring.num-1));
> + avail = (vq->vring.avail->idx & (vq->vring.num-1));
> vq->vring.avail->ring[avail] = head;
>
> + /* Descriptors and available array need to be set before we expose the
> + * new available array entries. */
> + virtio_wmb();
> + vq->vring.avail->idx++;
> + vq->num_added++;
> +
> pr_debug("Added buffer head %i to %p\n", head, vq);
> END_USE(vq);
>
> @@ -248,13 +254,10 @@ bool virtqueue_kick_prepare(struct virtq
> * new available array entries. */
> virtio_wmb();
>
> - old = vq->vring.avail->idx;
> - new = vq->vring.avail->idx = old + vq->num_added;
> + old = vq->vring.avail->idx - vq->num_added;
> + new = vq->vring.avail->idx;
> vq->num_added = 0;
>
> - /* Need to update avail index before checking if we should notify */
> - virtio_mb();
> -
> if (vq->event) {
> needs_kick = vring_need_event(vring_avail_event(&vq->vring),
> new, old);
>
>
> _______________________________________________
> Virtualization mailing list
> Virtualization@lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2011-11-13 21:03 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <patchbomb.1320306168@localhost6.localdomain6>
2011-11-03 7:42 ` [PATCH 1 of 5] virtio: document functions better Rusty Russell
2011-11-03 7:42 ` Rusty Russell
2011-11-03 7:49 ` Christoph Hellwig
2011-11-03 7:49 ` Christoph Hellwig
2011-11-03 7:42 ` [PATCH 2 of 5] virtio: rename virtqueue_add_buf_gfp to virtqueue_add_buf Rusty Russell
2011-11-03 7:42 ` Rusty Russell
2011-11-03 7:50 ` Christoph Hellwig
2011-11-03 7:50 ` Christoph Hellwig
2011-11-03 7:42 ` [PATCH 3 of 5] virtio: support unlocked queue kick Rusty Russell
2011-11-03 7:42 ` Rusty Russell
2011-11-03 7:52 ` Christoph Hellwig
2011-11-04 10:09 ` Stefan Hajnoczi
2011-11-04 10:09 ` Stefan Hajnoczi
2011-11-04 10:36 ` Rusty Russell
2011-11-04 10:36 ` Rusty Russell
2011-11-04 10:36 ` Rusty Russell
2011-11-03 7:52 ` Christoph Hellwig
2011-11-03 7:42 ` [PATCH 4 of 5] virtio: avoid modulus operation Rusty Russell
2011-11-03 7:42 ` Rusty Russell
2011-11-03 7:51 ` Pekka Enberg
2011-11-03 10:18 ` Rusty Russell
2011-11-03 10:18 ` Rusty Russell
2011-11-03 7:51 ` Pekka Enberg
2011-11-03 7:42 ` [PATCH 5 of 5] virtio: expose added descriptors immediately Rusty Russell
2011-11-03 7:42 ` Rusty Russell
2011-11-13 21:03 ` Michael S. Tsirkin [this message]
2011-11-13 21:03 ` Michael S. Tsirkin
2011-11-14 0:43 ` Rusty Russell
2011-11-14 0:43 ` Rusty Russell
2011-11-14 0:43 ` Rusty Russell
2011-11-14 6:56 ` Michael S. Tsirkin
2011-11-16 0:21 ` Rusty Russell
2011-11-16 7:18 ` Michael S. Tsirkin
2011-11-21 1:48 ` Rusty Russell
2011-11-21 11:57 ` Michael S. Tsirkin
2011-11-22 0:33 ` Rusty Russell
2011-11-22 6:29 ` Michael S. Tsirkin
2011-11-23 1:19 ` Rusty Russell
2011-11-23 8:30 ` Michael S. Tsirkin
2012-07-01 9:20 ` RFD: virtio balloon API use (was Re: [PATCH 5 of 5] virtio: expose added descriptors immediately) Michael S. Tsirkin
2012-07-01 9:20 ` Michael S. Tsirkin
2012-07-02 1:05 ` Rusty Russell
2012-07-02 1:05 ` Rusty Russell
2012-07-02 7:25 ` Michael S. Tsirkin
2012-07-02 7:25 ` Michael S. Tsirkin
2012-07-02 16:08 ` Rafael Aquini
2012-07-02 16:08 ` Rafael Aquini
2012-07-03 0:47 ` Rusty Russell
2012-07-03 16:26 ` Rafael Aquini
2012-07-03 16:26 ` Rafael Aquini
2012-07-04 10:55 ` Michael S. Tsirkin
2012-07-04 10:55 ` Michael S. Tsirkin
2012-07-08 23:39 ` Rusty Russell
2012-07-08 23:39 ` Rusty Russell
2012-07-04 10:55 ` Michael S. Tsirkin
2012-07-04 10:55 ` Michael S. Tsirkin
2012-07-02 7:33 ` [PATCH RFC] virtio-balloon: fix add/get API use Michael S. Tsirkin
2012-07-02 7:33 ` Michael S. Tsirkin
2012-07-04 3:27 ` Rusty Russell
2012-07-04 3:27 ` Rusty Russell
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=20111113210256.GA31621@redhat.com \
--to=mst@redhat.com \
--cc=hch@infradead.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rusty@rustcorp.com.au \
--cc=virtualization@lists.linux-foundation.org \
/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.