[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC v3 2/6] virtio: virtqueue_pop - VIRTIO_F_IN_ORDER support
From: |
Jonah Palmer |
Subject: |
[RFC v3 2/6] virtio: virtqueue_pop - VIRTIO_F_IN_ORDER support |
Date: |
Mon, 8 Apr 2024 11:34:04 -0400 |
Add VIRTIO_F_IN_ORDER feature support in virtqueue_split_pop and
virtqueue_packed_pop.
VirtQueueElements popped from the available/descritpor ring are added to
the VirtQueue's used_elems array in-order and in the same fashion as
they would be added the used and descriptor rings, respectively.
This will allow us to keep track of the current order, what elements
have been written, as well as an element's essential data after being
processed.
Signed-off-by: Jonah Palmer <jonah.palmer@oracle.com>
---
hw/virtio/virtio.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index fb6b4ccd83..3ad58100b2 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -1497,7 +1497,7 @@ static void *virtqueue_alloc_element(size_t sz, unsigned
out_num, unsigned in_nu
static void *virtqueue_split_pop(VirtQueue *vq, size_t sz)
{
- unsigned int i, head, max;
+ unsigned int i, j, head, max;
VRingMemoryRegionCaches *caches;
MemoryRegionCache indirect_desc_cache;
MemoryRegionCache *desc_cache;
@@ -1530,6 +1530,8 @@ static void *virtqueue_split_pop(VirtQueue *vq, size_t sz)
goto done;
}
+ j = vq->last_avail_idx;
+
if (!virtqueue_get_head(vq, vq->last_avail_idx++, &head)) {
goto done;
}
@@ -1621,6 +1623,12 @@ static void *virtqueue_split_pop(VirtQueue *vq, size_t
sz)
elem->in_sg[i] = iov[out_num + i];
}
+ if (virtio_vdev_has_feature(vdev, VIRTIO_F_IN_ORDER)) {
+ vq->used_elems[j].index = elem->index;
+ vq->used_elems[j].len = elem->len;
+ vq->used_elems[j].ndescs = elem->ndescs;
+ }
+
vq->inuse++;
trace_virtqueue_pop(vq, elem, elem->in_num, elem->out_num);
@@ -1749,6 +1757,13 @@ static void *virtqueue_packed_pop(VirtQueue *vq, size_t
sz)
elem->index = id;
elem->ndescs = (desc_cache == &indirect_desc_cache) ? 1 : elem_entries;
+
+ if (virtio_vdev_has_feature(vdev, VIRTIO_F_IN_ORDER)) {
+ vq->used_elems[vq->last_avail_idx].index = elem->index;
+ vq->used_elems[vq->last_avail_idx].len = elem->len;
+ vq->used_elems[vq->last_avail_idx].ndescs = elem->ndescs;
+ }
+
vq->last_avail_idx += elem->ndescs;
vq->inuse += elem->ndescs;
--
2.39.3
- [RFC v3 0/6] virtio,vhost: Add VIRTIO_F_IN_ORDER support, Jonah Palmer, 2024/04/08
- [RFC v3 1/6] virtio: Add bool to VirtQueueElement, Jonah Palmer, 2024/04/08
- [RFC v3 3/6] virtio: virtqueue_ordered_fill - VIRTIO_F_IN_ORDER support, Jonah Palmer, 2024/04/08
- [RFC v3 2/6] virtio: virtqueue_pop - VIRTIO_F_IN_ORDER support,
Jonah Palmer <=
- [RFC v3 6/6] virtio: Add VIRTIO_F_IN_ORDER property definition, Jonah Palmer, 2024/04/08
- [RFC v3 5/6] vhost, vhost-user: Add VIRTIO_F_IN_ORDER to vhost feature bits, Jonah Palmer, 2024/04/08
- [RFC v3 4/6] virtio: virtqueue_ordered_flush - VIRTIO_F_IN_ORDER support, Jonah Palmer, 2024/04/08
- Re: [RFC v3 0/6] virtio,vhost: Add VIRTIO_F_IN_ORDER support, Lei Yang, 2024/04/15