]> git.proxmox.com Git - pve-docs.git/blame - qm-pci-passthrough.adoc
pci passthrough: add example for functions
[pve-docs.git] / qm-pci-passthrough.adoc
CommitLineData
6e4c46c4
DC
1[[qm_pci_passthrough]]
2PCI(e) Passthrough
3------------------
4
5PCI(e) passthrough is a mechanism to give a virtual machine control over
49f20f1b
TL
6a PCI device from the host. This can have some advantages over using
7virtualized hardware, for example lower latency, higher performance, or more
8features (e.g., offloading).
6e4c46c4 9
49f20f1b 10But, if you pass through a device to a virtual machine, you cannot use that
6e4c46c4
DC
11device anymore on the host or in any other VM.
12
13General Requirements
14~~~~~~~~~~~~~~~~~~~~
15
16Since passthrough is a feature which also needs hardware support, there are
49f20f1b
TL
17some requirements to check and preparations to be done to make it work.
18
6e4c46c4
DC
19
20Hardware
21^^^^^^^^
49f20f1b
TL
22Your hardware needs to support `IOMMU` (*I*/*O* **M**emory **M**anagement
23**U**nit) interrupt remapping, this includes the CPU and the mainboard.
6e4c46c4 24
49f20f1b
TL
25Generally, Intel systems with VT-d, and AMD systems with AMD-Vi support this.
26But it is not guaranteed that everything will work out of the box, due
27to bad hardware implementation and missing or low quality drivers.
6e4c46c4 28
49f20f1b 29Further, server grade hardware has often better support than consumer grade
6e4c46c4
DC
30hardware, but even then, many modern system can support this.
31
49f20f1b
TL
32Please refer to your hardware vendor to check if they support this feature
33under Linux for your specific setup
34
6e4c46c4
DC
35
36Configuration
37^^^^^^^^^^^^^
38
49f20f1b
TL
39Once you ensured that your hardware supports passthrough, you will need to do
40some configuration to enable PCI(e) passthrough.
6e4c46c4 41
6e4c46c4 42
39d84f28 43.IOMMU
6e4c46c4 44
49f20f1b 45The IOMMU has to be activated on the kernel commandline. The easiest way is to
39d84f28 46enable trough grub. Edit `'/etc/default/grub'' and add the following to the
49f20f1b 47'GRUB_CMDLINE_LINUX_DEFAULT' variable:
6e4c46c4 48
49f20f1b
TL
49* for Intel CPUs:
50+
51----
52 intel_iommu=on
53----
54* for AMD CPUs:
55+
56----
6e4c46c4 57 amd_iommu=on
49f20f1b 58----
6e4c46c4 59
39d84f28 60[[qm_pci_passthrough_update_grub]]
49f20f1b
TL
61To bring this change in effect, make sure you run:
62
63----
64# update-grub
65----
6e4c46c4 66
39d84f28 67.Kernel Modules
6e4c46c4 68
49f20f1b
TL
69You have to make sure the following modules are loaded. This can be achieved by
70adding them to `'/etc/modules''
6e4c46c4 71
49f20f1b 72----
6e4c46c4
DC
73 vfio
74 vfio_iommu_type1
75 vfio_pci
76 vfio_virqfd
49f20f1b 77----
6e4c46c4 78
49f20f1b 79[[qm_pci_passthrough_update_initramfs]]
6e4c46c4 80After changing anything modules related, you need to refresh your
49f20f1b 81`initramfs`. On {pve} this can be done by executing:
6e4c46c4
DC
82
83----
49f20f1b 84# update-initramfs -u -k all
6e4c46c4
DC
85----
86
39d84f28 87.Finish Configuration
49f20f1b
TL
88
89Finally reboot to bring the changes into effect and check that it is indeed
90enabled.
6e4c46c4
DC
91
92----
49f20f1b 93# dmesg -e DMAR -e IOMMU -e AMD-Vi
6e4c46c4
DC
94----
95
49f20f1b
TL
96should display that `IOMMU`, `Directed I/O` or `Interrupt Remapping` is
97enabled, depending on hardware and kernel the exact message can vary.
6e4c46c4
DC
98
99It is also important that the device(s) you want to pass through
49f20f1b 100are in a *separate* `IOMMU` group. This can be checked with:
6e4c46c4
DC
101
102----
49f20f1b 103# find /sys/kernel/iommu_groups/ -type l
6e4c46c4
DC
104----
105
49f20f1b 106It is okay if the device is in an `IOMMU` group together with its functions
6e4c46c4
DC
107(e.g. a GPU with the HDMI Audio device) or with its root port or PCI(e) bridge.
108
109.PCI(e) slots
110[NOTE]
111====
49f20f1b
TL
112Some platforms handle their physical PCI(e) slots differently. So, sometimes
113it can help to put the card in a another PCI(e) slot, if you do not get the
114desired `IOMMU` group separation.
6e4c46c4
DC
115====
116
117.Unsafe interrupts
118[NOTE]
119====
120For some platforms, it may be necessary to allow unsafe interrupts.
49f20f1b
TL
121For this add the following line in a file ending with `.conf' file in
122*/etc/modprobe.d/*:
6e4c46c4 123
49f20f1b 124----
6e4c46c4 125 options vfio_iommu_type1 allow_unsafe_interrupts=1
49f20f1b 126----
6e4c46c4
DC
127
128Please be aware that this option can make your system unstable.
129====
130
13cae0c1
DC
131Notes for GPU passthrough
132^^^^^^^^^^^^^^^^^^^^^^^^^
133
134When passing through a GPU (be it a full device, or a vGPU), if you want to use
135it for displaying, you have to either physically connect a monitor to the
136card (if possible), or configure a remote desktop software (e.g., VNC, RDP)
137inside the guest and use that.
138
139It is not possible to display the content of the GPU via NoVNC/SPICE on the
140{pve} web interface.
141
142If you want to use the GPU for things like OpenCL or CUDA, this is not an issue,
143since the application should be able to choose the hardware without using
144it as a display.
145
49f20f1b 146Host Device Passthrough
6e4c46c4
DC
147~~~~~~~~~~~~~~~~~~~~~~~
148
149The most used variant of PCI(e) passthrough is to pass through a whole
49f20f1b
TL
150PCI(e) card, for example a GPU or a network card.
151
6e4c46c4
DC
152
153Host Configuration
154^^^^^^^^^^^^^^^^^^
155
49f20f1b
TL
156In this case, the host cannot use the card. There are two methods to achieve
157this:
6e4c46c4 158
49f20f1b
TL
159* pass the device IDs to the options of the 'vfio-pci' modules by adding
160+
161----
6e4c46c4 162 options vfio-pci ids=1234:5678,4321:8765
6e4c46c4 163----
49f20f1b
TL
164+
165to a .conf file in */etc/modprobe.d/* where `1234:5678` and `4321:8765` are
166the vendor and device IDs obtained by:
167+
168----
169# lcpci -nn
6e4c46c4
DC
170----
171
49f20f1b
TL
172* blacklist the driver completely on the host, ensuring that it is free to bind
173for passthrough, with
174+
175----
6e4c46c4 176 blacklist DRIVERNAME
49f20f1b
TL
177----
178+
179in a .conf file in */etc/modprobe.d/*.
6e4c46c4 180
49f20f1b
TL
181For both methods you need to
182xref:qm_pci_passthrough_update_initramfs[update the `initramfs`] again and
183reboot after that.
6e4c46c4 184
49f20f1b 185[[qm_pci_passthrough_vm_config]]
6e4c46c4
DC
186VM Configuration
187^^^^^^^^^^^^^^^^
49f20f1b
TL
188To pass through the device you need to set the *hostpciX* option in the VM
189configuration, for example by executing:
6e4c46c4
DC
190
191----
49f20f1b 192# qm set VMID -hostpci0 00:02.0
6e4c46c4
DC
193----
194
1c1241f2
DC
195If your device has multiple functions (e.g., ``00:02.0`' and ``00:02.1`'),
196you can pass them through all together with the shortened syntax ``00:02`'
6e4c46c4
DC
197
198There are some options to which may be necessary, depending on the device
49f20f1b
TL
199and guest OS:
200
201* *x-vga=on|off* marks the PCI(e) device as the primary GPU of the VM.
202With this enabled the *vga* configuration option will be ignored.
6e4c46c4 203
6e4c46c4 204* *pcie=on|off* tells {pve} to use a PCIe or PCI port. Some guests/device
49f20f1b
TL
205combination require PCIe rather than PCI. PCIe is only available for 'q35'
206machine types.
207
6e4c46c4
DC
208* *rombar=on|off* makes the firmware ROM visible for the guest. Default is on.
209Some PCI(e) devices need this disabled.
49f20f1b 210
6e4c46c4 211* *romfile=<path>*, is an optional path to a ROM file for the device to use.
49f20f1b
TL
212This is a relative path under */usr/share/kvm/*.
213
39d84f28 214.Example
6e4c46c4
DC
215
216An example of PCIe passthrough with a GPU set to primary:
217
218----
49f20f1b 219# qm set VMID -hostpci0 02:00,pcie=on,x-vga=on
6e4c46c4
DC
220----
221
49f20f1b 222
6e4c46c4
DC
223Other considerations
224^^^^^^^^^^^^^^^^^^^^
225
226When passing through a GPU, the best compatibility is reached when using
49f20f1b
TL
227'q35' as machine type, 'OVMF' ('EFI' for VMs) instead of SeaBIOS and PCIe
228instead of PCI. Note that if you want to use 'OVMF' for GPU passthrough, the
229GPU needs to have an EFI capable ROM, otherwise use SeaBIOS instead.
6e4c46c4
DC
230
231SR-IOV
232~~~~~~
233
49f20f1b
TL
234Another variant for passing through PCI(e) devices, is to use the hardware
235virtualization features of your devices, if available.
236
237'SR-IOV' (**S**ingle-**R**oot **I**nput/**O**utput **V**irtualization) enables
238a single device to provide multiple 'VF' (**V**irtual **F**unctions) to the
239system. Each of those 'VF' can be used in a different VM, with full hardware
240features and also better performance and lower latency than software
241virtualized devices.
6e4c46c4 242
49f20f1b
TL
243Currently, the most common use case for this are NICs (**N**etwork
244**I**nterface **C**ard) with SR-IOV support, which can provide multiple VFs per
245physical port. This allows using features such as checksum offloading, etc. to
246be used inside a VM, reducing the (host) CPU overhead.
6e4c46c4 247
6e4c46c4
DC
248
249Host Configuration
250^^^^^^^^^^^^^^^^^^
251
49f20f1b 252Generally, there are two methods for enabling virtual functions on a device.
6e4c46c4 253
49f20f1b 254* sometimes there is an option for the driver module e.g. for some
6e4c46c4 255Intel drivers
49f20f1b
TL
256+
257----
6e4c46c4 258 max_vfs=4
49f20f1b
TL
259----
260+
261which could be put file with '.conf' ending under */etc/modprobe.d/*.
6e4c46c4 262(Do not forget to update your initramfs after that)
49f20f1b 263+
6e4c46c4
DC
264Please refer to your driver module documentation for the exact
265parameters and options.
266
49f20f1b
TL
267* The second, more generic, approach is using the `sysfs`.
268If a device and driver supports this you can change the number of VFs on
269the fly. For example, to setup 4 VFs on device 0000:01:00.0 execute:
270+
6e4c46c4 271----
49f20f1b 272# echo 4 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
6e4c46c4 273----
49f20f1b
TL
274+
275To make this change persistent you can use the `sysfsutils` Debian package.
39d84f28 276After installation configure it via */etc/sysfs.conf* or a `FILE.conf' in
49f20f1b 277*/etc/sysfs.d/*.
6e4c46c4
DC
278
279VM Configuration
280^^^^^^^^^^^^^^^^
281
49f20f1b
TL
282After creating VFs, you should see them as separate PCI(e) devices when
283outputting them with `lspci`. Get their ID and pass them through like a
284xref:qm_pci_passthrough_vm_config[normal PCI(e) device].
6e4c46c4
DC
285
286Other considerations
287^^^^^^^^^^^^^^^^^^^^
288
289For this feature, platform support is especially important. It may be necessary
49f20f1b
TL
290to enable this feature in the BIOS/EFI first, or to use a specific PCI(e) port
291for it to work. In doubt, consult the manual of the platform or contact its
292vendor.
050192c5 293
d25f097c
TL
294Mediated Devices (vGPU, GVT-g)
295~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
050192c5 296
d25f097c
TL
297Mediated devices are another method to use reuse features and performance from
298physical hardware for virtualized hardware. These are found most common in
299virtualized GPU setups such as Intels GVT-g and Nvidias vGPUs used in their
300GRID technology.
301
302With this, a physical Card is able to create virtual cards, similar to SR-IOV.
303The difference is that mediated devices do not appear as PCI(e) devices in the
304host, and are such only suited for using in virtual machines.
050192c5 305
050192c5
DC
306
307Host Configuration
308^^^^^^^^^^^^^^^^^^
309
d25f097c 310In general your card's driver must support that feature, otherwise it will
050192c5
DC
311not work. So please refer to your vendor for compatbile drivers and how to
312configure them.
313
314Intels drivers for GVT-g are integraded in the Kernel and should work
d25f097c
TL
315with the 5th, 6th and 7th generation Intel Core Processors, further E3 v4, E3
316v5 and E3 v6 Xeon Processors are supported.
050192c5
DC
317
318To enable it for Intel Graphcs, you have to make sure to load the module
319'kvmgt' (for example via `/etc/modules`) and to enable it on the Kernel
d25f097c
TL
320commandline. For this you can edit `'/etc/default/grub'' and add the following
321to the 'GRUB_CMDLINE_LINUX_DEFAULT' variable:
050192c5
DC
322
323----
324 i915.enable_gvt=1
325----
326
327After that remember to
328xref:qm_pci_passthrough_update_initramfs[update the `initramfs`],
329xref:qm_pci_passthrough_update_grub[update grub] and
330reboot your host.
331
332VM Configuration
333^^^^^^^^^^^^^^^^
334
d25f097c
TL
335To use a mediated device, simply specify the `mdev` property on a `hostpciX`
336VM configuration option.
050192c5 337
d25f097c
TL
338You can get the supported devices via the 'sysfs'. For example, to list the
339supported types for the device '0000:00:02.0' you would simply execute:
050192c5
DC
340
341----
342# ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types
343----
344
345Each entry is a directory which contains the following important files:
346
d25f097c
TL
347* 'available_instances' contains the amount of still available instances of
348this type, each 'mdev' use in a VM reduces this.
050192c5 349* 'description' contains a short description about the capabilities of the type
d25f097c
TL
350* 'create' is the endpoint to create such a device, {pve} does this
351automatically for you, if a 'hostpciX' option with `mdev` is configured.
050192c5 352
d25f097c 353Example configuration with an `Intel GVT-g vGPU` (`Intel Skylake 6700k`):
050192c5
DC
354
355----
356# qm set VMID -hostpci0 00:02.0,mdev=i915-GVTg_V5_4
357----
358
359With this set, {pve} automatically creates such a device on VM start, and
360cleans it up again when the VM stops.