Spec said: "and len the total of bytes written into the buffer."
For inflateq, deflateq and statsq, we don't process in_sg so the used length should be zero. For free_page_vq, since the pages could be changed in the destination, we should make all pages used for safety. Signed-off-by: Jason Wang <jasow...@redhat.com> --- hw/virtio/virtio-balloon.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c index 17de2558cb..fb4426ac0c 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c @@ -231,7 +231,7 @@ static void balloon_stats_poll_cb(void *opaque) return; } - virtqueue_push(s->svq, s->stats_vq_elem, s->stats_vq_offset); + virtqueue_push(s->svq, s->stats_vq_elem, 0); virtio_notify(vdev, s->svq); g_free(s->stats_vq_elem); s->stats_vq_elem = NULL; @@ -438,7 +438,7 @@ static void virtio_balloon_handle_output(VirtIODevice *vdev, VirtQueue *vq) memory_region_unref(section.mr); } - virtqueue_push(vq, elem, offset); + virtqueue_push(vq, elem, 0); virtio_notify(vdev, vq); g_free(elem); virtio_balloon_pbp_free(&pbp); @@ -510,6 +510,7 @@ static bool get_free_page_hints(VirtIOBalloon *dev) VirtIODevice *vdev = VIRTIO_DEVICE(dev); VirtQueue *vq = dev->free_page_vq; bool ret = true; + size_t used = 0; int i; while (dev->block_iothread) { @@ -548,11 +549,12 @@ static bool get_free_page_hints(VirtIOBalloon *dev) for (i = 0; i < elem->in_num; i++) { qemu_guest_free_page_hint(elem->in_sg[i].iov_base, elem->in_sg[i].iov_len); + used += elem->in_sg[i].iov_len; } } out: - virtqueue_push(vq, elem, 1); + virtqueue_push(vq, elem, used); g_free(elem); return ret; } -- 2.25.1