[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v4 01/20] vhost: Fix bad return of descriptors
From: |
Eugenio Pérez |
Subject: |
[RFC PATCH v4 01/20] vhost: Fix bad return of descriptors |
Date: |
Thu, 31 Mar 2022 20:03:51 +0200 |
Only the first one of them were properly enqueued back.
Fixes: 100890f7ca ("vhost: Shadow virtqueue buffers forwarding")
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
---
hw/virtio/vhost-shadow-virtqueue.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/hw/virtio/vhost-shadow-virtqueue.c
b/hw/virtio/vhost-shadow-virtqueue.c
index b232803d1b..c17506df20 100644
--- a/hw/virtio/vhost-shadow-virtqueue.c
+++ b/hw/virtio/vhost-shadow-virtqueue.c
@@ -333,13 +333,25 @@ static void
vhost_svq_disable_notification(VhostShadowVirtqueue *svq)
svq->vring.avail->flags |= cpu_to_le16(VRING_AVAIL_F_NO_INTERRUPT);
}
+static uint16_t vhost_svq_last_desc_of_chain(VhostShadowVirtqueue *svq,
+ uint16_t i)
+{
+ vring_desc_t *descs = svq->vring.desc;
+
+ while (le16_to_cpu(descs[i].flags) & VRING_DESC_F_NEXT) {
+ i = le16_to_cpu(descs[i].next);
+ }
+
+ return i;
+}
+
static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq,
uint32_t *len)
{
vring_desc_t *descs = svq->vring.desc;
const vring_used_t *used = svq->vring.used;
vring_used_elem_t used_elem;
- uint16_t last_used;
+ uint16_t last_used, last_used_chain;
if (!vhost_svq_more_used(svq)) {
return NULL;
@@ -365,7 +377,8 @@ static VirtQueueElement
*vhost_svq_get_buf(VhostShadowVirtqueue *svq,
return NULL;
}
- descs[used_elem.id].next = svq->free_head;
+ last_used_chain = vhost_svq_last_desc_of_chain(svq, used_elem.id);
+ descs[last_used_chain].next = svq->free_head;
svq->free_head = used_elem.id;
*len = used_elem.len;
--
2.27.0
- [RFC PATCH v4 00/20] Net Control VQ support with asid in vDPA SVQ, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 01/20] vhost: Fix bad return of descriptors,
Eugenio Pérez <=
- [RFC PATCH v4 02/20] util: Return void on iova_tree_remove, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 03/20] vdpa: Add x-svq to NetdevVhostVDPAOptions, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 04/20] vhost: move descriptor translation to vhost_svq_vring_write_descs, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 05/20] vdpa: Fix index calculus at vhost_vdpa_svqs_start, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 06/20] virtio-net: use g_memdup2() instead of unsafe g_memdup(), Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 07/20] virtio-net: Expose ctrl virtqueue logic, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 08/20] vdpa: Extract get geatures part from vhost_vdpa_get_max_queue_pairs, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 09/20] virtio: Make virtqueue_alloc_element non-static, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 10/20] vhost: Add SVQElement, Eugenio Pérez, 2022/03/31
- [RFC PATCH v4 11/20] vhost: Add custom used buffer callback, Eugenio Pérez, 2022/03/31