On 1/19/26 08:59, Akihiko Odaki wrote: > On 2026/01/19 1:28, Dmitry Osipenko wrote: >> Support mapping virgl blobs to a fixed location of a hostmem memory >> region using new virglrenderer MAP_FIXED API. >> >> This new feature closes multiple problems for virtio-gpu on QEMU: >> >> - Having dedicated memory region for each mapped blob works notoriously >> slow due to QEMU's memory region software design built around RCU that >> isn't optimized for frequent removal of the regions >> >> - KVM isn't optimized for a frequent slot changes too >> >> - QEMU/KVM has a limit for a total number of created memory regions, >> crashing QEMU when limit is reached >> >> This patch makes virtio-gpu-gl to pre-create a single anonymous memory >> region covering whole hostmem area to which blobs will be mapped using >> the MAP_FIXED API. >> >> Not all virgl resources will support mapping at a fixed memory >> address. For >> them, we will continue to create individual nested memory sub-regions. In >> particular, vrend resources may not have MAP_FIXED capability. >> >> Venus and DRM native contexts will largely benefit from the MAP_FIXED >> feature in terms of performance and stability improvement. >> >> Tested-by: Yiwei Zhang <[email protected]> >> Signed-off-by: Dmitry Osipenko <[email protected]> >> --- >> hw/display/virtio-gpu-gl.c | 40 ++++++++++++++++++++++- >> hw/display/virtio-gpu-virgl.c | 59 +++++++++++++++++++++++++++++++++- >> include/hw/virtio/virtio-gpu.h | 3 ++ >> 3 files changed, 100 insertions(+), 2 deletions(-) >> >> diff --git a/hw/display/virtio-gpu-gl.c b/hw/display/virtio-gpu-gl.c >> index 8b71dd6fc26f..add6af73e980 100644 >> --- a/hw/display/virtio-gpu-gl.c >> +++ b/hw/display/virtio-gpu-gl.c >> @@ -13,6 +13,7 @@ >> #include "qemu/osdep.h" >> #include "qemu/iov.h" >> +#include "qemu/mmap-alloc.h" >> #include "qemu/module.h" >> #include "qemu/error-report.h" >> #include "qapi/error.h" >> @@ -106,7 +107,12 @@ static void virtio_gpu_gl_reset(VirtIODevice *vdev) >> static void virtio_gpu_gl_device_realize(DeviceState *qdev, Error >> **errp) >> { >> ERRP_GUARD(); >> - VirtIOGPU *g = VIRTIO_GPU(qdev); >> + VirtIOGPUBase *b = VIRTIO_GPU_BASE(qdev); >> + VirtIOGPU *g = VIRTIO_GPU(b); >> +#if !defined(CONFIG_WIN32) >> + VirtIOGPUGL *gl = VIRTIO_GPU_GL(g); >> + void *map; >> +#endif >> #if HOST_BIG_ENDIAN >> error_setg(errp, "virgl is not supported on bigendian platforms"); >> @@ -137,6 +143,27 @@ static void >> virtio_gpu_gl_device_realize(DeviceState *qdev, Error **errp) >> #endif >> virtio_gpu_device_realize(qdev, errp); >> + if (*errp) { >> + return; >> + } >> + >> +#if !defined(CONFIG_WIN32) >> + if (virtio_gpu_hostmem_enabled(b->conf)) { >> + map = qemu_ram_mmap(-1, b->conf.hostmem, >> qemu_real_host_page_size(), >> + 0, 0); >> + if (map == MAP_FAILED) { >> + error_setg_errno(errp, errno, >> + "virgl hostmem region could not be >> initialized"); >> + return; > > This "return" will leak bunch of memory allocated in > virtio_gpu_device_realize(). Though the relization code is not carefully > written to avoid memory leaks in case of errors, it is better to avoid > adding another by keeping virtio_gpu_device_realize() at the end. > > By the way, I think this is likely to be my last comment (unless I miss > nothing more; hopefully it won't happen). This patch and "[RFC PATCH v10 > 2/5] virtio-gpu: Validate hostmem mapping offset" are only useful after > the new release of virglrenderer is made, but the other patches are > independelty useful, so I suggest submitting them without RFC. > > Perhaps it may be even fine to submit the MAP_FIXED changes without RFC > before virglrenderer 1.2.1 is released since the merge request is > already accepted, but I leave that to you.
Thanks, will move the code in v11. New virglrenderer should be released soon as Gert Wollny returned form vacation today. May wait for the release before sending v11 without RFC. -- Best regards, Dmitry
