On 2026/08/26 6:37, Vladimir Sementsov-Ogievskiy wrote:
Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
---
  hw/display/virtio-gpu.c | 99 ++++++++++++++++++++++-------------------
  1 file changed, 52 insertions(+), 47 deletions(-)

diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index fbb6fec7a0a..1af640accdc 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -1308,13 +1308,13 @@ 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;
-    Error *err = NULL;
-    int i, ret;
+    int i;
/* in 2d mode we should never find unprocessed commands here */
      assert(QTAILQ_EMPTY(&g->cmdq));
@@ -1337,12 +1337,7 @@ static int virtio_gpu_save(QEMUFile *f, void *opaque, 
size_t size,
      }
      qemu_put_be32(f, 0); /* end of list */
- ret = vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL,
-                             &err);
-    if (ret < 0) {
-        error_report_err(err);
-    }
-    return ret;
+    return vmstate_save_vmsd(f, &vmstate_virtio_gpu_scanouts, g, NULL, errp);
  }
static bool virtio_gpu_load_restore_mapping(VirtIOGPU *g,
@@ -1374,14 +1369,13 @@ 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, hostmem, rowstride_bytes;
-    int i, ret;
+    int i;
g->hostmem = 0; @@ -1389,7 +1383,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);
@@ -1402,14 +1397,16 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, 
size_t size,
          /* allocate */
          pformat = virtio_gpu_get_pixman_format(res->format);
          if (!pformat) {
+            error_setg(errp, "Unknown pixman format %" PRIu32, res->format);
              g_free(res);
-            return -EINVAL;
+            return false;
          }
if (!calc_image_hostmem(pformat, res->width, res->height,
                                  &hostmem, &rowstride_bytes)) {
              g_free(res);
-            return -EINVAL;
+            error_setg(errp, "Failed to calculate image hostmem");
+            return false;
          }
          res->hostmem = hostmem;
          if (!qemu_pixman_image_new_shareable(&res->image,
@@ -1419,10 +1416,9 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, 
size_t size,
                                               res->width,
                                               res->height,
                                               rowstride_bytes,
-                                             &err)) {
-            warn_report_err(err);
+                                             errp)) {
              g_free(res);
-            return -EINVAL;
+            return false;
          }
res->addrs = g_try_new(uint64_t, res->iov_cnt);
@@ -1432,7 +1428,8 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, 
size_t size,
              g_free(res->addrs);
              g_free(res->iov);
              g_free(res);
-            return -EINVAL;
+            error_setg(errp, "Failed to allocate iov arrays");
+            return false;
          }
/* read data */
@@ -1446,22 +1443,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 */
-    ret = vmstate_load_state(f, &vmstate_virtio_gpu_scanouts, g, 1, &err);
-    if (ret < 0) {
-        error_report_err(err);
-    }
-    return ret;
+    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;
@@ -1485,11 +1480,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;
@@ -1500,7 +1495,8 @@ static int virtio_gpu_blob_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);
@@ -1514,7 +1510,8 @@ static int virtio_gpu_blob_load(QEMUFile *f, void 
*opaque, size_t size,
              g_free(res->addrs);
              g_free(res->iov);
              g_free(res);
-            return -EINVAL;
+            error_setg(errp, "Failed to allocate iov arrays");
+            return false;
          }
/* read data */
@@ -1525,15 +1522,19 @@ static int virtio_gpu_blob_load(QEMUFile *f, void 
*opaque, size_t size,
if (res->iov_cnt > 0 &&
              iov_size(res->iov, res->iov_cnt) < res->blob_size) {
+            error_setg(errp, "iov size %" PRIu64 " < blob_size %" PRIu64,
+                       (uint64_t)iov_size(res->iov, res->iov_cnt),

nitpick: I somewhat prefer:

            error_setg(errp, "iov size %zu < blob_size %" PRIu64,
                       iov_size(res->iov, res->iov_cnt),

because:

- it does not require thinking about the cast. The conditional above
  does perform implicit cast, but it automatically picks the wider type.
  The explicit cast here doesn't so requires a little more thought.

- it requries less typing.

And this hunk cannot be applied due to recent virtio-gpu fixes. Please rebase it.

+                       res->blob_size);
              g_free(res->addrs);
              g_free(res->iov);
              g_free(res);
-            return -EINVAL;
+            return false;
          }
if (!virtio_gpu_load_restore_mapping(g, res)) {
              g_free(res);
-            return -EINVAL;
+            error_setg(errp, "Failed to load restore mapping");

Let's say: "Failed to restore loaded mapping"

+            return false;
          }
virtio_gpu_init_udmabuf(res);
@@ -1541,10 +1542,10 @@ static int virtio_gpu_blob_load(QEMUFile *f, void 
*opaque, size_t size,
          resource_id = qemu_get_be32(f);
      }
- return 0;
+    return true;
  }
-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;
@@ -1559,7 +1560,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) {
@@ -1572,12 +1575,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");

Let's say: "A blob scanout lacks metadata".

Regards,
Akihiko Odaki

+                return false;
              }
              scanout->ds = qemu_create_displaysurface_pixman(res->image);
              qemu_displaysurface_set_share_handle(scanout->ds, 
res->share_handle, 0);
@@ -1591,7 +1596,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)
@@ -1777,8 +1782,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 */,
@@ -1804,8 +1809,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 */,
@@ -1815,7 +1820,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[] = {


Reply via email to