[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v9 01/23] vhost: Return earlier if used buffers overrun
From: |
Eugenio Pérez |
Subject: |
[RFC PATCH v9 01/23] vhost: Return earlier if used buffers overrun |
Date: |
Wed, 6 Jul 2022 20:39:46 +0200 |
Previous function misses the just picked avail buffer from the queue.
This way keeps blocking the used queue forever, but is cleaner to check
before calling to vhost_svq_get_buf.
Fixes: 100890f7cad50 ("vhost: Shadow virtqueue buffers forwarding")
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
---
hw/virtio/vhost-shadow-virtqueue.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/hw/virtio/vhost-shadow-virtqueue.c
b/hw/virtio/vhost-shadow-virtqueue.c
index 56c96ebd13..9280285435 100644
--- a/hw/virtio/vhost-shadow-virtqueue.c
+++ b/hw/virtio/vhost-shadow-virtqueue.c
@@ -405,19 +405,21 @@ static void vhost_svq_flush(VhostShadowVirtqueue *svq,
vhost_svq_disable_notification(svq);
while (true) {
uint32_t len;
- g_autofree VirtQueueElement *elem = vhost_svq_get_buf(svq, &len);
- if (!elem) {
- break;
- }
+ g_autofree VirtQueueElement *elem = NULL;
if (unlikely(i >= svq->vring.num)) {
qemu_log_mask(LOG_GUEST_ERROR,
"More than %u used buffers obtained in a %u size SVQ",
i, svq->vring.num);
- virtqueue_fill(vq, elem, len, i);
- virtqueue_flush(vq, i);
+ virtqueue_flush(vq, svq->vring.num);
return;
}
+
+ elem = vhost_svq_get_buf(svq, &len);
+ if (!elem) {
+ break;
+ }
+
virtqueue_fill(vq, elem, len, i++);
}
--
2.31.1
[RFC PATCH v9 06/23] virtio-net: Expose ctrl virtqueue logic, Eugenio Pérez, 2022/07/06
[RFC PATCH v9 02/23] vhost: move descriptor translation to vhost_svq_vring_write_descs, Eugenio Pérez, 2022/07/06
[RFC PATCH v9 07/23] vhost: add vhost_svq_push_elem, Eugenio Pérez, 2022/07/06