@@ -527,7 +527,8 @@ static bool get_free_page_hints(VirtIOBalloon *dev)
ret = false;
goto out;
}
- if (id == dev->free_page_report_cmd_id) {
+ if (dev->free_page_report_status == FREE_PAGE_REPORT_S_REQUESTED &&
+ id == dev->free_page_report_cmd_id) {
dev->free_page_report_status = FREE_PAGE_REPORT_S_START;
} else {
/*
@@ -592,14 +593,16 @@ static void virtio_balloon_free_page_start(VirtIOBalloon *s)
return;
}
- if (s->free_page_report_cmd_id == UINT_MAX) {
+ qemu_mutex_lock(&s->free_page_lock);
+
+ if (s->free_page_report_cmd_id++ == UINT_MAX) {
s->free_page_report_cmd_id =
VIRTIO_BALLOON_FREE_PAGE_REPORT_CMD_ID_MIN;
- } else {
- s->free_page_report_cmd_id++;
}
s->free_page_report_status = FREE_PAGE_REPORT_S_REQUESTED;
+ qemu_mutex_unlock(&s->free_page_lock);
+
virtio_notify_config(vdev);
}