From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark McLoughlin Subject: [PATCH 2/5] kvm: qemu: Introduce virtqueue_fill() and virtqueue_flush() Date: Wed, 8 Oct 2008 20:35:10 +0100 Message-ID: <1223494513-18826-2-git-send-email-markmc@redhat.com> References: <> <1223494513-18826-1-git-send-email-markmc@redhat.com> Cc: kvm@vger.kernel.org, Rusty Russell , Mark McLoughlin To: Avi Kivity Return-path: Received: from mail10.svc.cra.dublin.eircom.net ([159.134.118.26]:34752 "HELO mail10.svc.cra.dublin.eircom.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1756011AbYJHTf5 (ORCPT ); Wed, 8 Oct 2008 15:35:57 -0400 In-Reply-To: <1223494513-18826-1-git-send-email-markmc@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: Split virtqueue_push() into two logical steps - adding an element to the used ring and notifying the other side of added elements. Signed-off-by: Mark McLoughlin --- qemu/hw/virtio.c | 23 ++++++++++++++++++----- qemu/hw/virtio.h | 3 +++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/qemu/hw/virtio.c b/qemu/hw/virtio.c index b3ee649..74b898f 100644 --- a/qemu/hw/virtio.c +++ b/qemu/hw/virtio.c @@ -107,19 +107,32 @@ static void virtqueue_init(VirtQueue *vq, void *p) vq->vring.used = (void *)TARGET_PAGE_ALIGN((unsigned long)&vq->vring.avail->ring[vq->vring.num]); } -void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem, - unsigned int len) +void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem, + unsigned int len, unsigned int idx) { VRingUsedElem *used; + idx += vq->vring.used->idx; + /* Get a pointer to the next entry in the used ring. */ - used = &vq->vring.used->ring[vq->vring.used->idx % vq->vring.num]; + used = &vq->vring.used->ring[idx % vq->vring.num]; used->id = elem->index; used->len = len; +} + +void virtqueue_flush(VirtQueue *vq, unsigned int count) +{ /* Make sure buffer is written before we update index. */ wmb(); - vq->vring.used->idx++; - vq->inuse--; + vq->vring.used->idx += count; + vq->inuse -= count; +} + +void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem, + unsigned int len) +{ + virtqueue_fill(vq, elem, len, 0); + virtqueue_flush(vq, 1); } static unsigned virtqueue_next_desc(VirtQueue *vq, unsigned int i) diff --git a/qemu/hw/virtio.h b/qemu/hw/virtio.h index 0dcedbf..87a15cc 100644 --- a/qemu/hw/virtio.h +++ b/qemu/hw/virtio.h @@ -139,6 +139,9 @@ VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size, void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem, unsigned int len); +void virtqueue_flush(VirtQueue *vq, unsigned int count); +void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem, + unsigned int len, unsigned int idx); int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem); -- 1.5.4.3