The virtio-gpu driver running in the Guest VM can create Guest blob resources (by importing dmabufs) that are backed by System RAM. This is made possible by making use of memfd memory backend and udmabuf driver on the Host side. However, in order to create Guest blobs that are backed by vfio-pci device regions (which happens when virtio-gpu imports dmabufs from devices that have local memory such as dGPU VFs), we have to add support for creating dmabuf from multiple VFIO device ranges (same region) and leverage it in virtio-gpu.
So, while creating the blobs we first try to create a dmabuf by calling into the udmabuf driver assuming that the backing memory is memfd based. If that fails, and if it is determined that the blob is backed by a vfio-pci device region, we would then call into the vfio-pci driver to have a dmabuf fd created. Changelog: v3 -> v4: - Drop the patch that introduces ram_block_is_memfd_backed() - Drop the additional check in virtio_gpu_create_udmabuf() that checks for memfd backed ram blocks (Akihiko) - Remove rcu_read_lock/unlock and replace warn_report() with qemu_log_mask() in virtio_gpu_create_udmabuf() - Improve the commit message and logic in the patch that adds support for vfio_device_create_dmabuf_fd() - Rebase on top of vfio-next v2 -> v3: - Use memory_region_get_ram_ptr() to obtain hva for both memfd and VFIO backed memory regions (Akihiko) - Drop the patch that introduced qemu_iovec_same_memory_regions() helper and move the "same memory region" check into virtio_gpu_create_udmabuf(), vfio_device_create_dmabuf_fd() (Akihiko) - Refactor virtio_gpu_init_dmabuf() to not rely on helpers such as memory_region_is_ram_device() to identify memory regions and instead call virtio_gpu_create_udmabuf() unconditionally (Akihiko) - Add a patch to introduce ram_block_is_memfd_backed() helper v1 -> v2: - Drop the patch that uses res->blob_size instead of res->blob to identify blob resources (Akihiko) - Remove the res->dmabuf_fd < 0 check while attaching backing to a resource (Akihiko) - Remove cmd->cmd_hdr.type != VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB check while attaching backing (Akihiko) - Improve vfio_get_region_index_from_mr() and add documentation (Cedric) - Remove rcu_read_lock/unlock around qemu_ram_block_from_host() (Akihiko, Cedric) - Improve, document and rename vfio_device_create_dmabuf() to vfio_device_create_dmabuf_fd() (Cedric) - Add a new helper to lookup VFIO device from memory region (Cedric) - Document vfio_device_get_region_info() (Cedric) - Ensure that info variable (in vfio_dmabuf_mmap()) is initialized before use (Cedric) - Rename udmabuf files and helpers to dmabuf (Akihiko) - Remove the redundant check for virtio_gpu_have_udmabuf() in virtio_gpu_init_dmabuf() (Akihiko) - Add a helper to check whether all the entries of a dmabuf belong to a single memory region or not (Akihiko) RFC -> v1: - Create the CPU mapping using vfio device fd if the dmabuf exporter (vfio-pci) does not provide mmap() support (Akihiko) - Log a warning with LOG_GUEST_ERROR instead of warn_report() when dmabuf cannot be created using Guest provided addresses (Akihiko) - Use address_space_translate() instead of gpa2hva() to obtain the Host addresses (Akihiko) - Rearrange the patches and improve the commit messages (Akihiko) - Fix compilation error when VFIO is not enabled (Alex) - Add a new helper to obtain VFIO region index from memory region - Move vfio_device_create_dmabuf() to hw/vfio/device.c Tested with an SRIOV enabled Intel dGPU (B60) by running Gnome Wayland (in the VM) and Qemu with the following (relevant) parameters: -device vfio-pci,host=0000:03:00.1 -device virtio-vga,max_outputs=1,xres=1920,yres=1080,blob=true -display gtk,gl=on Associated virtio-gpu kernel driver series (merged): https://lore.kernel.org/dri-devel/[email protected]/ --- Cc: Marc-André Lureau <[email protected]> Cc: Alex Bennée <[email protected]> Cc: Akihiko Odaki <[email protected]> Cc: Dmitry Osipenko <[email protected]> Cc: Alex Williamson <[email protected]> Cc: Cédric Le Goater <[email protected]> Cc: Dongwon Kim <[email protected]> Vivek Kasireddy (8): virtio-gpu: Recreate the resource's dmabuf if new backing is attached virtio-gpu: Find hva for Guest's DMA addr associated with a ram device vfio: Document vfio_device_get_region_info() vfio/region: Add a helper to get region index from memory region vfio/device: Add a helper to lookup VFIODevice from memory region vfio/device: Add support for creating dmabuf from multiple ranges virtio-gpu: Rename udmabuf files and helpers to dmabuf virtio-gpu-dmabuf: Create dmabuf for blobs associated with VFIO devices hw/display/Kconfig | 5 + hw/display/meson.build | 4 +- ...abuf-stubs.c => virtio-gpu-dmabuf-stubs.c} | 4 +- ...rtio-gpu-udmabuf.c => virtio-gpu-dmabuf.c} | 127 ++++++++++++++++-- hw/display/virtio-gpu.c | 31 ++++- hw/vfio/device.c | 56 ++++++++ hw/vfio/region.c | 14 ++ include/hw/vfio/vfio-device.h | 46 +++++++ include/hw/virtio/virtio-gpu.h | 6 +- 9 files changed, 266 insertions(+), 27 deletions(-) rename hw/display/{virtio-gpu-udmabuf-stubs.c => virtio-gpu-dmabuf-stubs.c} (79%) rename hw/display/{virtio-gpu-udmabuf.c => virtio-gpu-dmabuf.c} (62%) -- 2.50.1
