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,