@samitouri / QOSamiQemu / commits / cd71534b22

hw/display/virtio-gpu: Propagate udmabuf errors

Propagate udmabuf errors so that the requested operation will be canceled instead of producing an incomplete result and the user can notice the failure. Fixes: e0933d91b1cd ("virtio-gpu: Add virtio_gpu_resource_create_blob") Fixes: f66767f75c9c ("virtio-gpu: add virtio-gpu/blob vmstate subsection") Fixes: 4ae1c5c7d6f3 ("hw/display/virtio-gpu: Initialize blob mapping for ATTACH_BACKING") Signed-off-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-ID: <20260825-dmabuf-v2-3-b3d64d3b9a0e@rsg.ci.i.u-tokyo.ac.jp>

Akihiko Odaki committed Aug 25, 2026 at 16:28 UTC cd71534b225c17c75ca745f13084abff12536f8b
4 files changed +22 -9
hw/display/virtio-gpu-udmabuf-stubs.c
+2 -1
@@ -7,9 +7,10 @@ bool virtio_gpu_have_udmabuf(void)
7 return false;
8 }
9
10 -void virtio_gpu_init_udmabuf(struct virtio_gpu_simple_resource *res)
10 +bool virtio_gpu_init_udmabuf(struct virtio_gpu_simple_resource *res)
11 {
12 /* nothing (stub) */
13 + return false;
14 }
15
16 void virtio_gpu_fini_udmabuf(VirtIOGPU *g, struct virtio_gpu_simple_resource *res)
hw/display/virtio-gpu-udmabuf.c
+5 -3
@@ -131,7 +131,7 @@ bool virtio_gpu_have_udmabuf(void)
131 return memfd_backend;
132 }
133
134 -void virtio_gpu_init_udmabuf(struct virtio_gpu_simple_resource *res)
134 +bool virtio_gpu_init_udmabuf(struct virtio_gpu_simple_resource *res)
135 {
136 void *pdata = NULL;
137
@@ -142,17 +142,19 @@ void virtio_gpu_init_udmabuf(struct virtio_gpu_simple_resource *res)
142 } else if (res->blob_size) {
143 virtio_gpu_create_udmabuf(res);
144 if (res->dmabuf_fd < 0) {
145 - return;
145 + return false;
146 }
147 virtio_gpu_remap_udmabuf(res);
148 if (!res->remapped) {
149 virtio_gpu_destroy_udmabuf(res);
150 - return;
150 + return false;
151 }
152 pdata = res->remapped;
153 }
154
155 res->blob = pdata;
156 +
157 + return true;
158 }
159
160 static void virtio_gpu_free_dmabuf(VirtIOGPU *g, VGPUDMABuf *dmabuf)
hw/display/virtio-gpu.c
+14 -4
@@ -383,7 +383,12 @@ static void virtio_gpu_resource_create_blob(VirtIOGPU *g,
383 return;
384 }
385
386 - virtio_gpu_init_udmabuf(res);
386 + if (!virtio_gpu_init_udmabuf(res)) {
387 + cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC;
388 + virtio_gpu_cleanup_mapping(g, res);
389 + g_free(res);
390 + return;
391 + }
392 }
393
394 QTAILQ_INSERT_HEAD(&g->reslist, res, next);
@@ -1045,8 +1050,9 @@ virtio_gpu_resource_attach_backing(VirtIOGPU *g,
1050 return;
1051 }
1052
1048 - if (!res->image) {
1049 - virtio_gpu_init_udmabuf(res);
1053 + if (!res->image && !virtio_gpu_init_udmabuf(res)) {
1054 + cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC;
1055 + virtio_gpu_cleanup_mapping(g, res);
1056 }
1057 }
1058
@@ -1558,7 +1564,11 @@ static int virtio_gpu_blob_load(QEMUFile *f, void *opaque, size_t size,
1564 return -EINVAL;
1565 }
1566
1561 - virtio_gpu_init_udmabuf(res);
1567 + if (!virtio_gpu_init_udmabuf(res)) {
1568 + virtio_gpu_cleanup_mapping(g, res);
1569 + g_free(res);
1570 + return -EINVAL;
1571 + }
1572 }
1573
1574 QTAILQ_INSERT_HEAD(&g->reslist, res, next);
include/hw/virtio/virtio-gpu.h
+1 -1
@@ -388,7 +388,7 @@ bool virtio_gpu_scanout_blob_to_fb(struct virtio_gpu_framebuffer *fb,
388
389 /* virtio-gpu-udmabuf.c */
390 bool virtio_gpu_have_udmabuf(void);
391 -void virtio_gpu_init_udmabuf(struct virtio_gpu_simple_resource *res);
391 +bool virtio_gpu_init_udmabuf(struct virtio_gpu_simple_resource *res);
392 void virtio_gpu_fini_udmabuf(VirtIOGPU *g,
393 struct virtio_gpu_simple_resource *res);
394 int virtio_gpu_update_dmabuf(VirtIOGPU *g,