When a gpu buffer backed by a guest-memory blob is unreferenced, virgl and rutabaga free the resource but not its addrs field, leaking memory on every unref.
In virtio-gpu-virgl.c, free res->base.addrs before freeing the resource. In virtio-gpu-rutabaga.c, call virtio_gpu_cleanup_mapping() before freeing the resource. Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/4634 Signed-off-by: Tom Desnoyers <[email protected]> --- hw/display/virtio-gpu-rutabaga.c | 1 + hw/display/virtio-gpu-virgl.c | 1 + 2 files changed, 2 insertions(+) diff --git a/hw/display/virtio-gpu-rutabaga.c b/hw/display/virtio-gpu-rutabaga.c index 3aafa4dc66..7907aea85a 100644 --- a/hw/display/virtio-gpu-rutabaga.c +++ b/hw/display/virtio-gpu-rutabaga.c @@ -164,6 +164,7 @@ virtio_gpu_rutabaga_resource_unref(VirtIOGPU *g, } QTAILQ_REMOVE(&g->reslist, res, next); + virtio_gpu_cleanup_mapping(g, res); g_free(res); } diff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c index f45571060f..b5b160c840 100644 --- a/hw/display/virtio-gpu-virgl.c +++ b/hw/display/virtio-gpu-virgl.c @@ -458,6 +458,7 @@ virtio_gpu_virgl_resource_unref(VirtIOGPU *g, QTAILQ_REMOVE(&g->reslist, &res->base, next); + g_free(res->base.addrs); g_free(res); return 0; -- 2.55.0
