Re: [PATCH 08/18] virtio_ring: support for used_event idx feature
From: Michael S. Tsirkin <hidden>
Date: 2011-05-15 12:48:14
Also in:
kvm, lkml
On Mon, May 09, 2011 at 01:47:32PM +0930, Rusty Russell wrote:
On Wed, 4 May 2011 23:51:38 +0300, "Michael S. Tsirkin" [off-list ref] wrote:quoted
Add support for the used_event idx feature: when enabling interrupts, publish the current avail index value to the host so that we get interrupts on the next update. Signed-off-by: Michael S. Tsirkin <redacted> --- drivers/virtio/virtio_ring.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-)diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 507d6eb..3a3ed75 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c@@ -320,6 +320,14 @@ void *virtqueue_get_buf(struct virtqueue *_vq, unsigned int *len) ret = vq->data[i]; detach_buf(vq, i); vq->last_used_idx++; + /* If we expect an interrupt for the next entry, tell host + * by writing event index and flush out the write before + * the read in the next get_buf call. */ + if (!(vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT)) { + vring_used_event(&vq->vring) = vq->last_used_idx; + virtio_mb(); + } +Hmm, so you're still using the avail->flags; it's just if thresholding is enabled the host will ignore it? It's a little subtle, but it keeps this patch small.
Right, that's exactly why I do it this way.
Perhaps we'll want to make it more explicit later. Thanks, Rusty.
Yes, e.g. it might be better to avoid touching that cache line, and track the current status in a private field in the guest. But I was unable to measure any effect from doing it either way. -- MST