@samitouri / QOSamiQemu / commits / 4611333538

virtio-gpu: Replace finish_unmapping with mapping_state

Allow virtio_gpu_virgl_unmap_resource_blob() to be invoked while async unmapping is in progress. Do it in preparation to improvement of virtio-gpu resetting that will require this change. Suggested-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp> Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com> Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> Message-ID: <20260303151422.977399-17-dmitry.osipenko@collabora.com> Message-ID: <20260304165043.1437519-19-alex.bennee@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

Dmitry Osipenko committed Mar 4, 2026 at 16:50 UTC 46113335386c3b4d7adac732bb24558ef9be7271
2 files changed +23 -7
hw/display/trace-events
+1 -1
@@ -39,7 +39,7 @@ virtio_gpu_cmd_res_create_2d(uint32_t res, uint32_t fmt, uint32_t w, uint32_t h)
39 virtio_gpu_cmd_res_create_3d(uint32_t res, uint32_t fmt, uint32_t w, uint32_t h, uint32_t d) "res 0x%x, fmt 0x%x, w %d, h %d, d %d"
40 virtio_gpu_cmd_res_create_blob(uint32_t res, uint64_t size) "res 0x%x, size %" PRId64
41 virtio_gpu_cmd_res_map_blob(uint32_t res, void *vmr, void *mr) "res 0x%x, vmr %p, mr %p"
42 -virtio_gpu_cmd_res_unmap_blob(uint32_t res, void *mr, bool finish_unmapping) "res 0x%x, mr %p, finish_unmapping %d"
42 +virtio_gpu_cmd_res_unmap_blob(uint32_t res, void *mr, int mapping_state) "res 0x%x, mr %p, mapping_state %d"
43 virtio_gpu_cmd_res_unref(uint32_t res) "res 0x%x"
44 virtio_gpu_cmd_res_back_attach(uint32_t res) "res 0x%x"
45 virtio_gpu_cmd_res_back_detach(uint32_t res) "res 0x%x"
hw/display/virtio-gpu-virgl.c
+22 -6
@@ -68,11 +68,17 @@ virgl_get_egl_display(G_GNUC_UNUSED void *cookie)
68 #endif
69
70 #if VIRGL_VERSION_MAJOR >= 1
71 +enum virtio_gpu_virgl_hostmem_region_mapping_state {
72 + VIRTIO_GPU_MR_MAPPED,
73 + VIRTIO_GPU_MR_UNMAP_STARTED,
74 + VIRTIO_GPU_MR_UNMAP_COMPLETED,
75 +};
76 +
77 struct virtio_gpu_virgl_hostmem_region {
78 Object parent_obj;
79 MemoryRegion mr;
80 struct VirtIOGPU *g;
75 - bool finish_unmapping;
81 + enum virtio_gpu_virgl_hostmem_region_mapping_state mapping_state;
82 };
83
84 #define TYPE_VIRTIO_GPU_VIRGL_HOSTMEM_REGION "virtio-gpu-virgl-hostmem-region"
@@ -109,7 +115,7 @@ static void virtio_gpu_virgl_hostmem_region_finalize(Object *obj)
115 return;
116 }
117
112 - vmr->finish_unmapping = true;
118 + vmr->mapping_state = VIRTIO_GPU_MR_UNMAP_COMPLETED;
119
120 b = VIRTIO_GPU_BASE(vmr->g);
121 b->renderer_blocked--;
@@ -167,6 +173,7 @@ virtio_gpu_virgl_map_resource_blob(VirtIOGPU *g,
173 object_initialize_child(OBJECT(g), name, vmr,
174 TYPE_VIRTIO_GPU_VIRGL_HOSTMEM_REGION);
175 vmr->g = g;
176 + vmr->mapping_state = VIRTIO_GPU_MR_MAPPED;
177
178 mr = &vmr->mr;
179 memory_region_init_ram_ptr(mr, OBJECT(vmr), "mr", size, data);
@@ -195,7 +202,8 @@ virtio_gpu_virgl_unmap_resource_blob(VirtIOGPU *g,
202
203 vmr = to_hostmem_region(res->mr);
204
198 - trace_virtio_gpu_cmd_res_unmap_blob(res->base.resource_id, mr, vmr->finish_unmapping);
205 + trace_virtio_gpu_cmd_res_unmap_blob(res->base.resource_id, mr,
206 + vmr->mapping_state);
207
208 /*
209 * Perform async unmapping in 3 steps:
@@ -206,7 +214,8 @@ virtio_gpu_virgl_unmap_resource_blob(VirtIOGPU *g,
214 * asynchronously by virtio_gpu_virgl_hostmem_region_finalize().
215 * 3. Finish the unmapping with final virgl_renderer_resource_unmap().
216 */
209 - if (vmr->finish_unmapping) {
217 + switch (vmr->mapping_state) {
218 + case VIRTIO_GPU_MR_UNMAP_COMPLETED:
219 res->mr = NULL;
220 g_free(vmr);
221
@@ -217,15 +226,22 @@ virtio_gpu_virgl_unmap_resource_blob(VirtIOGPU *g,
226 __func__, strerror(-ret));
227 return ret;
228 }
220 - } else {
221 - *cmd_suspended = true;
229 + break;
230
231 + case VIRTIO_GPU_MR_MAPPED:
232 /* render will be unblocked once MR is freed */
233 b->renderer_blocked++;
234
235 + vmr->mapping_state = VIRTIO_GPU_MR_UNMAP_STARTED;
236 +
237 /* memory region owns self res->mr object and frees it by itself */
238 memory_region_del_subregion(&b->hostmem, mr);
239 object_unparent(OBJECT(vmr));
240 +
241 + /* Fallthrough */
242 + case VIRTIO_GPU_MR_UNMAP_STARTED:
243 + *cmd_suspended = true;
244 + break;
245 }
246
247 return 0;