From: "Michael S. Tsirkin" <mst@redhat.com>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: 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: Wed, 16 Nov 2011 09:18:38 +0200 [thread overview]
Message-ID: <20111116071838.GE5433@redhat.com> (raw)
In-Reply-To: <871ut8q5mh.fsf@rustcorp.com.au>
On Wed, Nov 16, 2011 at 10:51:26AM +1030, Rusty Russell wrote:
> On Mon, 14 Nov 2011 08:56:06 +0200, "Michael S. Tsirkin" <mst@redhat.com> wrote:
> > On Sun, Nov 13, 2011 at 11:03:13PM +0200, Michael S. Tsirkin wrote:
> > > 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))?
> >
> > Thinking about it more - it might be tricky for drivers
> > to ensure this. add used to fail when vq is full, but now
> > driver might do get between add and notify:
> > lock
> > add_buf * N
> > prep
> > unlock
> > lock
> > get_buf * N
> > unlock
> > lock
> > add_buf
> > prep
> > unlock
> > notify
> >
> > and since add was followed by get, this doesn't fail.
>
> Right, the driver could, in theory, do:
> add_buf()
> if (!get_buf())
> notify()
>
> But we don't allow that at the moment in our API: we insist on a notify
> occasionally. Noone does this at the moment, so a WARN_ON is correct.
>
> If you're just add_buf() without the get_buf() then add_buf() will fail
> already.
>
> Here's my current variant:
>
> 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
> @@ -245,9 +245,19 @@ 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++;
> +
> + /* If you haven't kicked in this long, you're probably doing something
> + * wrong. */
> + WARN_ON(vq->num_added > vq->vring.num);
> +
> pr_debug("Added buffer head %i to %p\n", head, vq);
> END_USE(vq);
>
> It's hard to write a useful WARN_ON() for the "you should kick more
> regularly" case (we could take timestamps if DEBUG is defined, I guess),
> so let's leave this until someone actually trips it.
>
> Thanks,
> Rusty.
My unlocked kick patches will trip this warning: they make
virtio-net do add + get without kick.
I think block with unlocked kick can trip it too:
add, lock is dropped and then an interrupt can get.
We also don't need a kick each num - each 2^15 is enough.
Why don't we do this at start of add_buf:
if (vq->num_added >= 0x7fff)
return -ENOSPC;
--
MST
next prev parent reply other threads:[~2011-11-16 7:18 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 7:51 ` Pekka Enberg
2011-11-03 10:18 ` Rusty Russell
2011-11-03 10:18 ` Rusty Russell
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
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 [this message]
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=20111116071838.GE5433@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.