Making queue_reset functional with virtio-gpu-gl, virtio-gpu-rutabaga,
and vhost-user-gpu requires adding corresponding APIs to their backends.
queue_reset is useless for them after all since they do not have
multiple queues that contend for buffers. It is not necessary to keep
queue_reset available for migration compatibility since they don't
support migration. Reject queue_reset for these devices.
Fixes: 69e1c14aa222 ("virtio: core: vq reset feature negotation support")
Fixes: 1dcc6adbc168 ("gfxstream + rutabaga: add initial support for gfxstream")
Signed-off-by: Akihiko Odaki <[email protected]>
---
hw/display/vhost-user-gpu.c | 7 +++++++
hw/display/virtio-gpu-gl.c | 12 ++++++++++++
hw/display/virtio-gpu-rutabaga.c | 11 +++++++++++
3 files changed, 30 insertions(+)
diff --git a/hw/display/vhost-user-gpu.c b/hw/display/vhost-user-gpu.c
index f8d640557c28..880a9fecc81a 100644
--- a/hw/display/vhost-user-gpu.c
+++ b/hw/display/vhost-user-gpu.c
@@ -625,6 +625,8 @@ vhost_user_gpu_instance_init(Object *obj)
g->vhost = VHOST_USER_BACKEND(object_new(TYPE_VHOST_USER_BACKEND));
object_property_add_alias(obj, "chardev",
OBJECT(g->vhost), "chardev");
+
+ object_property_set_bool(obj, "queue_reset", false, &error_abort);
}
static void
@@ -661,6 +663,11 @@ vhost_user_gpu_device_realize(DeviceState *qdev, Error
**errp)
VhostUserGPU *g = VHOST_USER_GPU(qdev);
VirtIODevice *vdev = VIRTIO_DEVICE(g);
+ if (virtio_host_has_feature(VIRTIO_DEVICE(qdev), VIRTIO_F_RING_RESET)) {
+ error_setg(errp, "queue_reset is not supported");
+ return;
+ }
+
vhost_dev_set_config_notifier(&g->vhost->dev, &config_ops);
if (vhost_user_backend_dev_init(g->vhost, vdev, 2, errp) < 0) {
return;
diff --git a/hw/display/virtio-gpu-gl.c b/hw/display/virtio-gpu-gl.c
index 2b7a41c46643..d215e897c1d5 100644
--- a/hw/display/virtio-gpu-gl.c
+++ b/hw/display/virtio-gpu-gl.c
@@ -17,6 +17,7 @@
#include "qemu/module.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
+#include "qom/object.h"
#include "system/system.h"
#include "hw/virtio/virtio.h"
#include "hw/virtio/virtio-gpu.h"
@@ -119,6 +120,11 @@ static void virtio_gpu_gl_device_realize(DeviceState
*qdev, Error **errp)
return;
#endif
+ if (virtio_host_has_feature(VIRTIO_DEVICE(qdev), VIRTIO_F_RING_RESET)) {
+ error_setg(errp, "queue_reset is not supported");
+ return;
+ }
+
if (!object_resolve_path_type("", TYPE_VIRTIO_GPU_GL, NULL)) {
error_setg(errp, "at most one %s device is permitted",
TYPE_VIRTIO_GPU_GL);
return;
@@ -209,6 +215,11 @@ static void virtio_gpu_gl_device_unrealize(DeviceState
*qdev)
*/
}
+static void virtio_gpu_gl_instance_init(Object *obj)
+{
+ object_property_set_bool(obj, "queue_reset", false, &error_abort);
+}
+
static void virtio_gpu_gl_class_init(ObjectClass *klass, const void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
@@ -232,6 +243,7 @@ static const TypeInfo virtio_gpu_gl_info = {
.name = TYPE_VIRTIO_GPU_GL,
.parent = TYPE_VIRTIO_GPU,
.instance_size = sizeof(VirtIOGPUGL),
+ .instance_init = virtio_gpu_gl_instance_init,
.class_init = virtio_gpu_gl_class_init,
};
module_obj(TYPE_VIRTIO_GPU_GL);
diff --git a/hw/display/virtio-gpu-rutabaga.c b/hw/display/virtio-gpu-rutabaga.c
index f28daa844328..c77e72c88e96 100644
--- a/hw/display/virtio-gpu-rutabaga.c
+++ b/hw/display/virtio-gpu-rutabaga.c
@@ -1124,6 +1124,11 @@ static void virtio_gpu_rutabaga_realize(DeviceState
*qdev, Error **errp)
return;
#endif
+ if (virtio_host_has_feature(VIRTIO_DEVICE(qdev), VIRTIO_F_RING_RESET)) {
+ error_setg(errp, "queue_reset is not supported");
+ return;
+ }
+
error_setg(&bdev->migration_blocker, "rutabaga is not yet migratable");
if (migrate_add_blocker(&bdev->migration_blocker, errp) < 0) {
return;
@@ -1165,6 +1170,11 @@ static const Property virtio_gpu_rutabaga_properties[] =
{
DEFINE_PROP_STRING("wsi", VirtIOGPURutabaga, wsi),
};
+static void virtio_gpu_rutabaga_instance_init(Object *obj)
+{
+ object_property_set_bool(obj, "queue_reset", false, &error_abort);
+}
+
static void virtio_gpu_rutabaga_class_init(ObjectClass *klass, const void
*data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
@@ -1187,6 +1197,7 @@ static const TypeInfo virtio_gpu_rutabaga_info[] = {
.name = TYPE_VIRTIO_GPU_RUTABAGA,
.parent = TYPE_VIRTIO_GPU,
.instance_size = sizeof(VirtIOGPURutabaga),
+ .instance_init = virtio_gpu_rutabaga_instance_init,
.class_init = virtio_gpu_rutabaga_class_init,
},
};
--
2.55.0