--- title: Virtual Function I/O Mediated devices (vfio-mdev) description: Create and Configure Virtual Function I/O Mediated devices (vfio-mdev) published: true date: 2022-07-28T01:25:56.298Z tags: editor: markdown dateCreated: 2022-07-21T21:10:41.046Z --- # Configure Virtual Function I/O Mediated devices > *These instructions only cover Intel GPUs that are compatible with vfio-mdev (5th to 10th generation). Since generation 11th, vfio-mdev has been replaced by SR-IOV.* {.is-warning} GPUs compatible with [Virtual Function I/O Mediated devices](https://www.kernel.org/doc/html/latest/driver-api/vfio-mediated-device.html) (vfio-mdev) can be split into multiple virtual GPUs (vGPUs). vGPUs can be assigned to virtual machines or containers. *How to do so?* ## Preparation * Make sure the GRUB has been updated after [the first boot](https://wiki.phyllo.me/getstarted/disk#update-grub-and-reboot) ### Modify the system allocated to the GPU in the BIOS/UEFI > Some computers allow you to modify the system memory allocated or shared with the integrated GPU, which may allow you to create more vGPUs. {.is-info} > For Intel integrated graphics cards only; rarely available on laptops computers. {.is-warning} * Before the host operating system boots up, you need to enter the BIOS/UEFI and to look for a setting called *GPU aperture size*, or *GPU shared memory*. * Use the highest possible value. > System memory will be reserved for the GPU, so make sure you have enough system memory to accomodate both the GPU and your operating system. {.is-warning} ## Create a virtual GPU Upon reboot, you should then be able to list available GPUs using the `mdevctl` command. * List available virtual GPUs: ``` mdevctl types ``` ``` 0000:00:02.0 i915-GVTg_V5_1 Available instances: 1 Device API: vfio-pci Description: low_gm_size: 512MB, high_gm_size: 2048MB, fence: 4, resolution: 1920x1200, weight: 16 i915-GVTg_V5_2 Available instances: 2 Device API: vfio-pci Description: low_gm_size: 256MB, high_gm_size: 1024MB, fence: 4, resolution: 1920x1200, weight: 8 i915-GVTg_V5_4 Available instances: 5 Device API: vfio-pci Description: low_gm_size: 128MB, high_gm_size: 512MB, fence: 4, resolution: 1920x1200, weight: 4 i915-GVTg_V5_8 Available instances: 7 Device API: vfio-pci Description: low_gm_size: 64MB, high_gm_size: 384MB, fence: 4, resolution: 1024x768, weight: 2 ``` > Increasing the system memory allocated to the GPU (GPU aperture size), as shown in the previous section, may increase the number and kind of available instances. {.is-info} In this case, the `i915-GVTg_V5_4` kind seems to offer the best trade-offs between the available resolution and the number of available instances. * Generate a universally unique identifier (UUID) with the following command: ``` uuidgen ``` ``` 7686131b-b229-4768-a02c-35d1dbed7c66 ``` * Start a vGPU based on the kind `i915-GVTg_V5_4` using the previously generated UUID ``` sudo mdevctl start -u 7686131b-b229-4768-a02c-35d1dbed7c66 -p 0000:00:02.0 --type i915-GVTg_V5_4 ``` * Define, or make this vGPU permanent. ``` sudo mdevctl define -u 7686131b-b229-4768-a02c-35d1dbed7c66 ``` * Set the vGPU to auto-start after the host boots up, so that it is available to guest virtual machines without further action ``` sudo mdevctl modify -u 7686131b-b229-4768-a02c-35d1dbed7c66 --auto ``` * Finally, verify that the vGPU has successfully been created and is set to auto-start: ``` mdevctl list -d ``` ``` 7686131b-b229-4768-a02c-35d1dbed7c66 0000:00:02.0 i915-GVTg_V5_4 auto (active) ``` Great you have ## Assign a virtual GPU to a virtual machine * Add that segment to a virtual machine's definition. Make sure the provided ```uuid``` matches the previously generated UUID. ``` [...] [...]
[...] [...] ``` > Notice that the RAMFB is set to on, which activates Drect Memory Access Buffers (DMA-BUFs), making available the output of a virtual monitor before the guest operating system takes over {.is-info} ## Configure Spice / SDL *To-do* ## Remove any video device * Remove any video device such as `virtio-gpu` and set the last one to the `none`. ``` [...] [...] [...] [...] ``` * Then starts the domain ## Resources * Official page for vfio-mdev: https://www.kernel.org/doc/html/latest/driver-api/vfio-mediated-device.html * Archlinux's *must read entry* on Intel GVT-g: https://wiki.archlinux.org/title/Intel_GVT-g * DMA-BUF Linux documentation: https://www.kernel.org/doc/html/latest/driver-api/dma-buf.html