[RFC 13/22] hw/display/virtio-gpu: move to new migration APIs

Vladimir Sementsov-Ogievskiy posted 22 patches 2 weeks, 2 days ago
[RFC 13/22] hw/display/virtio-gpu: move to new migration APIs
Posted by Vladimir Sementsov-Ogievskiy 2 weeks, 2 days ago
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
 hw/display/virtio-gpu.c | 66 ++++++++++++++++++++++-------------------
 1 file changed, 35 insertions(+), 31 deletions(-)

diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index 3a555125be..9356ef391a 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -1220,8 +1220,9 @@ static const VMStateDescription vmstate_virtio_gpu_scanouts = {
     },
 };
 
-static int virtio_gpu_save(QEMUFile *f, void *opaque, size_t size,
-                           const VMStateField *field, JSONWriter *vmdesc)
+static bool virtio_gpu_save(QEMUFile *f, void *opaque, size_t size,
+                            const VMStateField *field, JSONWriter *vmdesc,
+                            Error **errp)
 {
     VirtIOGPU *g = opaque;
     struct virtio_gpu_simple_resource *res;
@@ -1248,8 +1249,7 @@ static int virtio_gpu_save(QEMUFile *f, void *opaque, size_t size,
     }
     qemu_put_be32(f, 0); /* end of list */
 
-    return vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL,
-                              &error_fatal);
+    return vmstate_save_vmsd(f, &vmstate_virtio_gpu_scanouts, g, NULL, errp);
 }
 
 static bool virtio_gpu_load_restore_mapping(VirtIOGPU *g,
@@ -1281,11 +1281,10 @@ static bool virtio_gpu_load_restore_mapping(VirtIOGPU *g,
     return true;
 }
 
-static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
-                           const VMStateField *field)
+static bool virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
+                            const VMStateField *field, Error **errp)
 {
     VirtIOGPU *g = opaque;
-    Error *err = NULL;
     struct virtio_gpu_simple_resource *res;
     uint32_t resource_id, pformat;
     int i;
@@ -1296,7 +1295,8 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
     while (resource_id != 0) {
         res = virtio_gpu_find_resource(g, resource_id);
         if (res) {
-            return -EINVAL;
+            error_setg(errp, "Failed to find resource %" PRIu32, resource_id);
+            return false;
         }
 
         res = g_new0(struct virtio_gpu_simple_resource, 1);
@@ -1310,7 +1310,8 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
         pformat = virtio_gpu_get_pixman_format(res->format);
         if (!pformat) {
             g_free(res);
-            return -EINVAL;
+            error_setg(errp, "Unknown pixman format %" PRIu32, res->format);
+            return false;
         }
 
         res->hostmem = calc_image_hostmem(pformat, res->width, res->height);
@@ -1321,10 +1322,9 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
                                              res->width,
                                              res->height,
                                              res->height ? res->hostmem / res->height : 0,
-                                             &err)) {
-            warn_report_err(err);
+                                             errp)) {
             g_free(res);
-            return -EINVAL;
+            return false;
         }
 
         res->addrs = g_new(uint64_t, res->iov_cnt);
@@ -1341,20 +1341,20 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
         if (!virtio_gpu_load_restore_mapping(g, res)) {
             pixman_image_unref(res->image);
             g_free(res);
-            return -EINVAL;
+            error_setg(errp, "Failed to load restore mapping");
+            return false;
         }
 
         resource_id = qemu_get_be32(f);
     }
 
     /* load & apply scanout state */
-    vmstate_load_state(f, &vmstate_virtio_gpu_scanouts, g, 1, &error_fatal);
-
-    return 0;
+    return vmstate_load_vmsd(f, &vmstate_virtio_gpu_scanouts, g, 1, errp);
 }
 
-static int virtio_gpu_blob_save(QEMUFile *f, void *opaque, size_t size,
-                                const VMStateField *field, JSONWriter *vmdesc)
+static bool virtio_gpu_blob_save(QEMUFile *f, void *opaque, size_t size,
+                                 const VMStateField *field, JSONWriter *vmdesc,
+                                 Error **errp)
 {
     VirtIOGPU *g = opaque;
     struct virtio_gpu_simple_resource *res;
@@ -1378,11 +1378,11 @@ static int virtio_gpu_blob_save(QEMUFile *f, void *opaque, size_t size,
     }
     qemu_put_be32(f, 0); /* end of list */
 
-    return 0;
+    return true;
 }
 
-static int virtio_gpu_blob_load(QEMUFile *f, void *opaque, size_t size,
-                                const VMStateField *field)
+static bool virtio_gpu_blob_load(QEMUFile *f, void *opaque, size_t size,
+                                 const VMStateField *field, Error **errp)
 {
     VirtIOGPU *g = opaque;
     struct virtio_gpu_simple_resource *res;
@@ -1422,7 +1422,7 @@ static int virtio_gpu_blob_load(QEMUFile *f, void *opaque, size_t size,
     return 0;
 }
 
-static int virtio_gpu_post_load(void *opaque, int version_id)
+static bool virtio_gpu_post_load(void *opaque, int version_id, Error **errp)
 {
     VirtIOGPU *g = opaque;
     struct virtio_gpu_scanout *scanout;
@@ -1437,7 +1437,9 @@ static int virtio_gpu_post_load(void *opaque, int version_id)
 
         res = virtio_gpu_find_resource(g, scanout->resource_id);
         if (!res) {
-            return -EINVAL;
+            error_setg(errp, "Failed to find resource %" PRIu32,
+                       scanout->resource_id);
+            return false;
         }
 
         if (scanout->fb.format != 0) {
@@ -1450,12 +1452,14 @@ static int virtio_gpu_post_load(void *opaque, int version_id)
             };
 
             if (!virtio_gpu_do_set_scanout(g, i, &scanout->fb, res, &r, &error)) {
-                return -EINVAL;
+                error_setg(errp, "Failed to set scanout");
+                return false;
             }
         } else {
             /* legacy v1 migration support */
             if (!res->image) {
-                return -EINVAL;
+                error_setg(errp, "No image");
+                return false;
             }
             scanout->ds = qemu_create_displaysurface_pixman(res->image);
             qemu_displaysurface_set_share_handle(scanout->ds, res->share_handle, 0);
@@ -1469,7 +1473,7 @@ static int virtio_gpu_post_load(void *opaque, int version_id)
         res->scanout_bitmask |= (1 << i);
     }
 
-    return 0;
+    return true;
 }
 
 void virtio_gpu_device_realize(DeviceState *qdev, Error **errp)
@@ -1638,8 +1642,8 @@ const VMStateDescription vmstate_virtio_gpu_blob_state = {
             .name = "virtio-gpu/blob",
             .info = &(const VMStateInfo) {
                 .name = "blob",
-                .get = virtio_gpu_blob_load,
-                .put = virtio_gpu_blob_save,
+                .load = virtio_gpu_blob_load,
+                .save = virtio_gpu_blob_save,
             },
             .flags = VMS_SINGLE,
         } /* device */,
@@ -1665,8 +1669,8 @@ static const VMStateDescription vmstate_virtio_gpu = {
             .name = "virtio-gpu",
             .info = &(const VMStateInfo) {
                         .name = "virtio-gpu",
-                        .get = virtio_gpu_load,
-                        .put = virtio_gpu_save,
+                        .load = virtio_gpu_load,
+                        .save = virtio_gpu_save,
             },
             .flags = VMS_SINGLE,
         } /* device */,
@@ -1676,7 +1680,7 @@ static const VMStateDescription vmstate_virtio_gpu = {
         &vmstate_virtio_gpu_blob_state,
         NULL
     },
-    .post_load = virtio_gpu_post_load,
+    .post_load_errp = virtio_gpu_post_load,
 };
 
 static const Property virtio_gpu_properties[] = {
-- 
2.48.1