wiki/gofurther/vfio-mdev.md

4.9 KiB

title description published date tags editor dateCreated
Virtual Function I/O Mediated devices (vfio-mdev) Create and Configure Virtual Function I/O Mediated devices (vfio-mdev) true 2022-07-28T01:25:56.298Z markdown 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 (vfio-mdev) can be split into multiple virtual GPUs (vGPUs).

vGPUs can be assigned to virtual machines or containers.

How to do so?

Preparation

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.
<domain>
[...]
<device>
[...]
    <hostdev mode="subsystem" type="mdev" managed="no" model="vfio-pci" display="on" ramfb="on">
      <source>
        <address uuid="7686131b-b229-4768-a02c-35d1dbed7c66"/>
      </source>
      <address type="pci" domain="0x0000" bus="0x09" slot="0x00" function="0x0"/>
    </hostdev>
[...]
</device>
[...]
</domain>

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.
<domain>
[...]
<device>
[...]
    <video>
    	<model type="none"/>
    </video>
[...]
</device>
[...]
</domain>
  • Then starts the domain

Resources