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