提交 de889221 编写于 作者: D Dr. David Alan Gilbert 提交者: Michael S. Tsirkin

virtio-gpu: Use migrate_add_blocker for virgl migration blocking

virgl conditionally registers a vmstate as unmigratable when virgl
is enabled; instead use the migrate_add_blocker mechanism.
Signed-off-by: NDr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
Reviewed-by: NCornelia Huck <cornelia.huck@de.ibm.com>
Reviewed-by: NGerd Hoffmann <kraxel@redhat.com>
上级 428d2ed2
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "hw/virtio/virtio.h" #include "hw/virtio/virtio.h"
#include "hw/virtio/virtio-gpu.h" #include "hw/virtio/virtio-gpu.h"
#include "hw/virtio/virtio-bus.h" #include "hw/virtio/virtio-bus.h"
#include "migration/migration.h"
#include "qemu/log.h" #include "qemu/log.h"
#include "qapi/error.h" #include "qapi/error.h"
...@@ -986,11 +987,6 @@ static const VMStateDescription vmstate_virtio_gpu_scanouts = { ...@@ -986,11 +987,6 @@ static const VMStateDescription vmstate_virtio_gpu_scanouts = {
}, },
}; };
static const VMStateDescription vmstate_virtio_gpu_unmigratable = {
.name = "virtio-gpu-with-virgl",
.unmigratable = 1,
};
static void virtio_gpu_save(QEMUFile *f, void *opaque) static void virtio_gpu_save(QEMUFile *f, void *opaque)
{ {
VirtIOGPU *g = opaque; VirtIOGPU *g = opaque;
...@@ -1169,13 +1165,23 @@ static void virtio_gpu_device_realize(DeviceState *qdev, Error **errp) ...@@ -1169,13 +1165,23 @@ static void virtio_gpu_device_realize(DeviceState *qdev, Error **errp)
} }
if (virtio_gpu_virgl_enabled(g->conf)) { if (virtio_gpu_virgl_enabled(g->conf)) {
vmstate_register(qdev, -1, &vmstate_virtio_gpu_unmigratable, g); error_setg(&g->migration_blocker, "virgl is not yet migratable");
migrate_add_blocker(g->migration_blocker);
} else { } else {
register_savevm(qdev, "virtio-gpu", -1, VIRTIO_GPU_VM_VERSION, register_savevm(qdev, "virtio-gpu", -1, VIRTIO_GPU_VM_VERSION,
virtio_gpu_save, virtio_gpu_load, g); virtio_gpu_save, virtio_gpu_load, g);
} }
} }
static void virtio_gpu_device_unrealize(DeviceState *qdev, Error **errp)
{
VirtIOGPU *g = VIRTIO_GPU(qdev);
if (g->migration_blocker) {
migrate_del_blocker(g->migration_blocker);
error_free(g->migration_blocker);
}
}
static void virtio_gpu_instance_init(Object *obj) static void virtio_gpu_instance_init(Object *obj)
{ {
} }
...@@ -1237,6 +1243,7 @@ static void virtio_gpu_class_init(ObjectClass *klass, void *data) ...@@ -1237,6 +1243,7 @@ static void virtio_gpu_class_init(ObjectClass *klass, void *data)
VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
vdc->realize = virtio_gpu_device_realize; vdc->realize = virtio_gpu_device_realize;
vdc->unrealize = virtio_gpu_device_unrealize;
vdc->get_config = virtio_gpu_get_config; vdc->get_config = virtio_gpu_get_config;
vdc->set_config = virtio_gpu_set_config; vdc->set_config = virtio_gpu_set_config;
vdc->get_features = virtio_gpu_get_features; vdc->get_features = virtio_gpu_get_features;
......
...@@ -118,6 +118,8 @@ typedef struct VirtIOGPU { ...@@ -118,6 +118,8 @@ typedef struct VirtIOGPU {
uint32_t req_3d; uint32_t req_3d;
uint32_t bytes_3d; uint32_t bytes_3d;
} stats; } stats;
Error *migration_blocker;
} VirtIOGPU; } VirtIOGPU;
extern const GraphicHwOps virtio_gpu_ops; extern const GraphicHwOps virtio_gpu_ops;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册