FD fields should be initialized to a non-fd value to avoid confusion and
potential invalid closes. The following patch will change the guard to
finish/close dmabuf and rely on fd being initialized instead.

Signed-off-by: Marc-André Lureau <[email protected]>
---
 hw/display/virtio-gpu-rutabaga.c | 4 +++-
 hw/display/virtio-gpu-udmabuf.c  | 3 ++-
 hw/display/virtio-gpu-virgl.c    | 6 +++---
 hw/display/virtio-gpu.c          | 5 ++++-
 4 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/hw/display/virtio-gpu-rutabaga.c b/hw/display/virtio-gpu-rutabaga.c
index 5344a5f9e26a..ae158de480f5 100644
--- a/hw/display/virtio-gpu-rutabaga.c
+++ b/hw/display/virtio-gpu-rutabaga.c
@@ -101,6 +101,7 @@ rutabaga_cmd_create_resource_2d(VirtIOGPU *g,
     CHECK(!result, cmd);
 
     res = g_new0(struct virtio_gpu_simple_resource, 1);
+    res->dmabuf_fd = -1;
     res->width = c2d.width;
     res->height = c2d.height;
     res->format = c2d.format;
@@ -140,6 +141,7 @@ rutabaga_cmd_create_resource_3d(VirtIOGPU *g,
     CHECK(!result, cmd);
 
     res = g_new0(struct virtio_gpu_simple_resource, 1);
+    res->dmabuf_fd = -1;
     res->width = c3d.width;
     res->height = c3d.height;
     res->format = c3d.format;
@@ -637,7 +639,7 @@ rutabaga_cmd_resource_create_blob(VirtIOGPU *g,
     CHECK(cblob.resource_id != 0, cmd);
 
     res = g_new0(struct virtio_gpu_simple_resource, 1);
-
+    res->dmabuf_fd = -1;
     res->resource_id = cblob.resource_id;
     res->blob_size = cblob.size;
 
diff --git a/hw/display/virtio-gpu-udmabuf.c b/hw/display/virtio-gpu-udmabuf.c
index 094646af8636..4e9806f82144 100644
--- a/hw/display/virtio-gpu-udmabuf.c
+++ b/hw/display/virtio-gpu-udmabuf.c
@@ -132,7 +132,8 @@ void virtio_gpu_init_udmabuf(struct 
virtio_gpu_simple_resource *res)
 {
     void *pdata = NULL;
 
-    res->dmabuf_fd = -1;
+    assert(res->dmabuf_fd == -1);
+
     if (res->iov_cnt == 1 &&
         res->iov[0].iov_len < 4096) {
         pdata = res->iov[0].iov_base;
diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
index 8b27fe3980d6..291373274dee 100644
--- a/hw/display/virtio-gpu-virgl.c
+++ b/hw/display/virtio-gpu-virgl.c
@@ -336,11 +336,11 @@ static void virgl_cmd_create_resource_2d(VirtIOGPU *g,
     }
 
     res = g_new0(struct virtio_gpu_virgl_resource, 1);
+    res->base.dmabuf_fd = -1;
     res->base.width = c2d.width;
     res->base.height = c2d.height;
     res->base.format = c2d.format;
     res->base.resource_id = c2d.resource_id;
-    res->base.dmabuf_fd = -1;
     QTAILQ_INSERT_HEAD(&g->reslist, &res->base, next);
 
     args.handle = c2d.resource_id;
@@ -384,11 +384,11 @@ static void virgl_cmd_create_resource_3d(VirtIOGPU *g,
     }
 
     res = g_new0(struct virtio_gpu_virgl_resource, 1);
+    res->base.dmabuf_fd = -1;
     res->base.width = c3d.width;
     res->base.height = c3d.height;
     res->base.format = c3d.format;
     res->base.resource_id = c3d.resource_id;
-    res->base.dmabuf_fd = -1;
     QTAILQ_INSERT_HEAD(&g->reslist, &res->base, next);
 
     args.handle = c3d.resource_id;
@@ -862,9 +862,9 @@ static void virgl_cmd_resource_create_blob(VirtIOGPU *g,
     }
 
     res = g_new0(struct virtio_gpu_virgl_resource, 1);
+    res->base.dmabuf_fd = -1;
     res->base.resource_id = cblob.resource_id;
     res->base.blob_size = cblob.size;
-    res->base.dmabuf_fd = -1;
 
     if (cblob.blob_mem != VIRTIO_GPU_BLOB_MEM_HOST3D) {
         ret = virtio_gpu_create_mapping_iov(g, cblob.nr_entries, sizeof(cblob),
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index a7f549a6a8b9..521d4800d872 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -274,7 +274,7 @@ static void virtio_gpu_resource_create_2d(VirtIOGPU *g,
     }
 
     res = g_new0(struct virtio_gpu_simple_resource, 1);
-
+    res->dmabuf_fd = -1;
     res->width = c2d.width;
     res->height = c2d.height;
     res->format = c2d.format;
@@ -360,6 +360,7 @@ static void virtio_gpu_resource_create_blob(VirtIOGPU *g,
     }
 
     res = g_new0(struct virtio_gpu_simple_resource, 1);
+    res->dmabuf_fd = -1;
     res->resource_id = cblob.resource_id;
     res->blob_size = cblob.size;
 
@@ -1407,6 +1408,7 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, 
size_t size,
         }
 
         res = g_new0(struct virtio_gpu_simple_resource, 1);
+        res->dmabuf_fd = -1;
         res->resource_id = resource_id;
         res->width = qemu_get_be32(f);
         res->height = qemu_get_be32(f);
@@ -1518,6 +1520,7 @@ static int virtio_gpu_blob_load(QEMUFile *f, void 
*opaque, size_t size,
         }
 
         res = g_new0(struct virtio_gpu_simple_resource, 1);
+        res->dmabuf_fd = -1;
         res->resource_id = resource_id;
         res->blob_size = qemu_get_be32(f);
         res->iov_cnt = qemu_get_be32(f);

-- 
2.55.0.543.g5ebe2ebe4ea8


Reply via email to