summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Wang2021-11-29 04:08:40 +0100
committerMichael S. Tsirkin2021-11-29 14:49:36 +0100
commit0fe7245d8b938f371556c100b0b6ec1d2b41e584 (patch)
treee382a8ea9a8bc8d63263fd8408948314c695c025
parentvdpa: Add dummy receive callback (diff)
downloadqemu-0fe7245d8b938f371556c100b0b6ec1d2b41e584.tar.gz
qemu-0fe7245d8b938f371556c100b0b6ec1d2b41e584.tar.xz
qemu-0fe7245d8b938f371556c100b0b6ec1d2b41e584.zip
virtio-balloon: process all in sgs for free_page_vq
We only process the first in sg which may lead to the bitmap of the pages belongs to following sgs were not cleared. This may result more pages to be migrated. Fixing this by process all in sgs for free_page_vq. Acked-by: David Hildenbrand <david@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com> Message-Id: <20211129030841.3611-1-jasowang@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r--hw/virtio/virtio-balloon.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index c6962fcbfe..17de2558cb 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -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;
+ int i;
while (dev->block_iothread) {
qemu_cond_wait(&dev->free_page_cond, &dev->free_page_lock);
@@ -544,8 +545,10 @@ static bool get_free_page_hints(VirtIOBalloon *dev)
}
if (elem->in_num && dev->free_page_hint_status == FREE_PAGE_HINT_S_START) {
- qemu_guest_free_page_hint(elem->in_sg[0].iov_base,
- elem->in_sg[0].iov_len);
+ 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);
+ }
}
out: