Commit ab277b5585 for qemu.org
commit ab277b55859793e570593190f99a862664c14267
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date: Mon Aug 31 16:23:07 2026 +0400
virtio-gpu: extract virtio_gpu_disable_scanout_for_resource helper
The same loop iterating scanouts and disabling those matching a given
resource_id was duplicated across four call sites in three backends.
Factor it into a shared helper.
Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
diff --git a/hw/display/virtio-gpu-rutabaga.c b/hw/display/virtio-gpu-rutabaga.c
index 8697dd6936..3aafa4dc66 100644
--- a/hw/display/virtio-gpu-rutabaga.c
+++ b/hw/display/virtio-gpu-rutabaga.c
@@ -146,14 +146,9 @@ virtio_gpu_rutabaga_resource_unref(VirtIOGPU *g,
Error **errp)
{
int32_t result;
- int i;
VirtIOGPURutabaga *vr = VIRTIO_GPU_RUTABAGA(g);
- for (i = 0; i < g->parent_obj.conf.max_outputs; i++) {
- if (g->parent_obj.scanout[i].resource_id == res->resource_id) {
- virtio_gpu_disable_scanout(g, i);
- }
- }
+ virtio_gpu_disable_scanout_for_resource(g, res->resource_id);
result = rutabaga_resource_unref(vr->rutabaga, res->resource_id);
if (result) {
diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c
index 494be3fb4f..1c9380e2a6 100644
--- a/hw/display/virtio-gpu-virgl.c
+++ b/hw/display/virtio-gpu-virgl.c
@@ -431,7 +431,6 @@ virtio_gpu_virgl_resource_unref(VirtIOGPU *g,
{
struct iovec *res_iovs = NULL;
int num_iovs = 0;
- int i;
#if VIRGL_VERSION_MAJOR >= 1
int ret;
@@ -444,11 +443,7 @@ virtio_gpu_virgl_resource_unref(VirtIOGPU *g,
}
#endif
- for (i = 0; i < g->parent_obj.conf.max_outputs; i++) {
- if (g->parent_obj.scanout[i].resource_id == res->base.resource_id) {
- virtio_gpu_disable_scanout(g, i);
- }
- }
+ virtio_gpu_disable_scanout_for_resource(g, res->base.resource_id);
virgl_renderer_force_ctx_0();
virgl_renderer_resource_detach_iov(res->base.resource_id,
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index e8a0dd24c8..bb0f41bb1e 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -444,17 +444,21 @@ void virtio_gpu_disable_scanout(VirtIOGPU *g, int scanout_id)
scanout->height = 0;
}
-static void virtio_gpu_resource_destroy(VirtIOGPU *g,
- struct virtio_gpu_simple_resource *res,
- Error **errp)
+void virtio_gpu_disable_scanout_for_resource(VirtIOGPU *g,
+ uint32_t resource_id)
{
- int i;
-
- for (i = 0; i < g->parent_obj.conf.max_outputs; i++) {
- if (g->parent_obj.scanout[i].resource_id == res->resource_id) {
+ for (int i = 0; i < g->parent_obj.conf.max_outputs; i++) {
+ if (g->parent_obj.scanout[i].resource_id == resource_id) {
virtio_gpu_disable_scanout(g, i);
}
}
+}
+
+static void virtio_gpu_resource_destroy(VirtIOGPU *g,
+ struct virtio_gpu_simple_resource *res,
+ Error **errp)
+{
+ virtio_gpu_disable_scanout_for_resource(g, res->resource_id);
qemu_pixman_image_unref(res->image);
virtio_gpu_cleanup_mapping(g, res);
@@ -1062,13 +1066,7 @@ void virtio_gpu_cleanup_mapping(VirtIOGPU *g,
struct virtio_gpu_simple_resource *res)
{
if (res->blob) {
- int i, max_outputs = g->parent_obj.conf.max_outputs;
-
- for (i = 0; i < max_outputs; i++) {
- if (g->parent_obj.scanout[i].resource_id == res->resource_id) {
- virtio_gpu_disable_scanout(g, i);
- }
- }
+ virtio_gpu_disable_scanout_for_resource(g, res->resource_id);
}
virtio_gpu_cleanup_mapping_iov(g, res->iov, res->iov_cnt);
diff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h
index 2f18d839cc..631dfc63a4 100644
--- a/include/hw/virtio/virtio-gpu.h
+++ b/include/hw/virtio/virtio-gpu.h
@@ -404,6 +404,8 @@ void virtio_gpu_update_scanout(VirtIOGPU *g,
struct virtio_gpu_framebuffer *fb,
struct virtio_gpu_rect *r);
void virtio_gpu_disable_scanout(VirtIOGPU *g, int scanout_id);
+void virtio_gpu_disable_scanout_for_resource(VirtIOGPU *g,
+ uint32_t resource_id);
/* virtio-gpu-3d.c */
void virtio_gpu_virgl_process_cmd(VirtIOGPU *g,