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") Acked-by: Jason Wang <jasow...@redhat.com> Signed-off-by: Eugenio Pérez <epere...@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