[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 14/49] virtio: combine write of an entry into used ri
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL 14/49] virtio: combine write of an entry into used ring |
Date: |
Thu, 4 Feb 2016 23:50:32 +0200 |
From: Vincenzo Maffione <address@hidden>
Fill in an element of the used ring with a single combined access to the
guest physical memory, rather than using two separated accesses.
This reduces the overhead due to expensive address translation.
Signed-off-by: Vincenzo Maffione <address@hidden>
Message-Id: <address@hidden>
Reviewed-by: Cornelia Huck <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
Reviewed-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
hw/virtio/virtio.c | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 9608358..90f2545 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -153,18 +153,15 @@ static inline uint16_t vring_get_used_event(VirtQueue *vq)
return vring_avail_ring(vq, vq->vring.num);
}
-static inline void vring_used_ring_id(VirtQueue *vq, int i, uint32_t val)
+static inline void vring_used_write(VirtQueue *vq, VRingUsedElem *uelem,
+ int i)
{
hwaddr pa;
- pa = vq->vring.used + offsetof(VRingUsed, ring[i].id);
- virtio_stl_phys(vq->vdev, pa, val);
-}
-
-static inline void vring_used_ring_len(VirtQueue *vq, int i, uint32_t val)
-{
- hwaddr pa;
- pa = vq->vring.used + offsetof(VRingUsed, ring[i].len);
- virtio_stl_phys(vq->vdev, pa, val);
+ virtio_tswap32s(vq->vdev, &uelem->id);
+ virtio_tswap32s(vq->vdev, &uelem->len);
+ pa = vq->vring.used + offsetof(VRingUsed, ring[i]);
+ address_space_write(&address_space_memory, pa, MEMTXATTRS_UNSPECIFIED,
+ (void *)uelem, sizeof(VRingUsedElem));
}
static uint16_t vring_used_idx(VirtQueue *vq)
@@ -273,15 +270,17 @@ void virtqueue_discard(VirtQueue *vq, const
VirtQueueElement *elem,
void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
unsigned int len, unsigned int idx)
{
+ VRingUsedElem uelem;
+
trace_virtqueue_fill(vq, elem, len, idx);
virtqueue_unmap_sg(vq, elem, len);
idx = (idx + vq->used_idx) % vq->vring.num;
- /* Get a pointer to the next entry in the used ring. */
- vring_used_ring_id(vq, idx, elem->index);
- vring_used_ring_len(vq, idx, len);
+ uelem.id = elem->index;
+ uelem.len = len;
+ vring_used_write(vq, &uelem, idx);
}
void virtqueue_flush(VirtQueue *vq, unsigned int count)
--
MST
- [Qemu-devel] [PULL 00/49] pc and misc cleanups and fixes, virtio optimizations, Michael S. Tsirkin, 2016/02/04
- [Qemu-devel] [PULL 14/49] virtio: combine write of an entry into used ring,
Michael S. Tsirkin <=
- [Qemu-devel] [PULL 01/49] Fix virtio migration, Michael S. Tsirkin, 2016/02/04
- [Qemu-devel] [PULL 02/49] pc: acpi: merge SSDT into DSDT, Michael S. Tsirkin, 2016/02/04
- [Qemu-devel] [PULL 03/49] tests: pc: acpi: drop not needed 'expected SSDT' blobs, Michael S. Tsirkin, 2016/02/04
- [Qemu-devel] [PULL 04/49] tests: pc: acpi: add expected DSDT.bridge blobs and update DSDT blobs, Michael S. Tsirkin, 2016/02/04
- [Qemu-devel] [PULL 05/49] virtio: move VirtQueueElement at the beginning of the structs, Michael S. Tsirkin, 2016/02/04
- [Qemu-devel] [PULL 07/49] virtio: introduce qemu_get/put_virtqueue_element, Michael S. Tsirkin, 2016/02/04
- [Qemu-devel] [PULL 06/49] virtio: move allocation to virtqueue_pop/vring_pop, Michael S. Tsirkin, 2016/02/04
- [Qemu-devel] [PULL 08/49] virtio: introduce virtqueue_alloc_element, Michael S. Tsirkin, 2016/02/04