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
