On Thu, Jul 7, 2022 at 2:40 AM Eugenio Pérez <epere...@redhat.com> wrote: > > 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 <epere...@redhat.com>
Acked-by: Jason Wang <jasow...@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 >