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


Reply via email to