docs: Rework the PCI passthrough guides

Rewrite the document, making the following changes:

- Remove use of bullet points in favour of more descriptive steps
- Cross-reference various configuration options
- Emphasise that ``[pci] alias`` must be set on both controller and
  compute node
- Style nits, such as fixing the header style

Change-Id: I2ac7df7d235f0af25f5a99bc8f6abddbae2cb3af
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
Stephen Finucane 2019-02-06 17:47:32 +00:00
parent 38c774a8e0
commit d5259abfe1

View File

@ -22,48 +22,51 @@ assigned to only one guest and cannot be shared.
**Limitations**
* Attaching SR-IOV ports to existing servers is not currently supported, see
`bug 1708433 <https://bugs.launchpad.net/nova/+bug/1708433>`_ for details.
* Attaching SR-IOV ports to existing servers is not currently supported.
This is now rejected by the API but previously it fail later in the
process. See `bug 1708433 <https://bugs.launchpad.net/nova/+bug/1708433>`_
for details.
* Cold migration (resize) of servers with SR-IOV devices attached was not
supported until the 14.0.0 Newton release, see
`bug 1512800 <https://bugs.launchpad.net/nova/+bug/1512880>`_ for details.
To enable PCI passthrough, follow the steps below:
#. Configure nova-scheduler (Controller)
#. Configure nova-api (Controller)**
#. Configure a flavor (Controller)
#. Enable PCI passthrough (Compute)
#. Configure PCI devices in nova-compute (Compute)
To enable PCI passthrough, follow the steps below.
.. note::
The PCI device with address ``0000:41:00.0`` is used as an example. This
will differ between environments.
The PCI device with address ``0000:41:00.0``, the vendor ID of ``8086`` and
the product ID of ``154d`` is used as an example. This will differ between
environments.
Configure nova-scheduler (Controller)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#. Configure ``nova-scheduler`` as specified in :neutron-doc:`Configure
nova-scheduler
<admin/config-sriov.html#configure-nova-scheduler-controller>`.
Configure ``nova-scheduler`` (Controller)
-----------------------------------------
#. Restart the ``nova-scheduler`` service.
The :program:`nova-scheduler` service must be configured to enable the
``PciPassthroughFilter``. To do this, add this filter to the list of filters
specified in :oslo.config:option:`filter_scheduler.enabled_filters` and set
:oslo.config:option:`filter_scheduler.available_filters` to the default of
``nova.scheduler.filters.all_filters``. For example:
Configure nova-api (Controller)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: ini
#. Specify the PCI alias for the device.
[filter_scheduler]
enabled_filters = ...,PciPassthroughFilter
available_filters = nova.scheduler.filters.all_filters
Configure a PCI alias ``a1`` to request a PCI device with a ``vendor_id`` of
``0x8086`` and a ``product_id`` of ``0x154d``. The ``vendor_id`` and
``product_id`` correspond the PCI device with address ``0000:41:00.0``.
Once done, restart the :program:`nova-scheduler` service.
Edit ``/etc/nova/nova.conf``:
.. _pci-passthrough-alias:
Configure ``nova-api`` (Controller)
-----------------------------------
PCI devices are requested through flavor extra specs, specifically via the
``pci_passthrough:alias`` flavor extra spec. However, the aliases themselves
must be configured. This done via the :oslo.config:option:`pci.alias`
configuration option. For example, to configure a PCI alias ``a1`` to request
a PCI device with a vendor ID of ``0x8086`` and a product ID of ``0x154d``:
.. code-block:: ini
@ -72,33 +75,45 @@ Configure nova-api (Controller)
Refer to :oslo.config:option:`pci.alias` for syntax information.
#. Restart the ``nova-api`` service.
Once configured, restart the :program:`nova-api` service.
Configure a flavor (Controller)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. important::
Configure a flavor to request two PCI devices, each with ``vendor_id`` of
``0x8086`` and ``product_id`` of ``0x154d``:
This option must also be configured on compute nodes. This is discussed later
in this document.
Configure a flavor (API)
------------------------
Once the alias has been configured, it can be used for an flavor extra spec.
For example, to request two of the PCI devices referenced by alias ``a1``, run:
.. code-block:: console
# openstack flavor set m1.large --property "pci_passthrough:alias"="a1:2"
$ openstack flavor set m1.large --property "pci_passthrough:alias"="a1:2"
For more information about the syntax for ``pci_passthrough:alias``, refer to
:ref:`Flavors <extra-spec-pci-passthrough>`.
Enable PCI passthrough (Compute)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enable VT-d and IOMMU. For more information, refer to steps one and two in
:neutron-doc:`Create Virtual Functions
<admin/config-sriov.html#create-virtual-functions-compute>`.
Configure host (Compute)
------------------------
For Hyper-V compute nodes, the requirements are as follows:
To enable PCI passthrough on an x86, Linux-based compute node, the following
are required:
* Windows 10 or Windows / Hyper-V Server 2016 or newer.
* VT-d and SR-IOV enabled on the host.
* Assignable PCI devices.
* VT-d enabled in the BIOS
* IOMMU enabled on the host OS, by adding the ``intel_iommu=on`` or
``amd_iommu=on`` parameter to the kernel parameters
* Assignable PCIe devices
To enable PCI passthrough on a Hyper-V compute node, the following are
required:
* Windows 10 or Windows / Hyper-V Server 2016 or newer
* VT-d enabled on the host
* Assignable PCI devices
In order to check the requirements above and if there are any assignable PCI
devices, run the following Powershell commands:
@ -115,40 +130,38 @@ passthrough`__.
.. __: https://devblogs.microsoft.com/scripting/passing-through-devices-to-hyper-v-vms-by-using-discrete-device-assignment/
Configure PCI devices (Compute)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#. Configure ``nova-compute`` to allow the PCI device to pass through to
VMs. Edit ``/etc/nova/nova.conf``:
Configure ``nova-compute`` (Compute)
------------------------------------
Once PCI passthrough has been configured for the host, :program:`nova-compute`
must be configured to allow the PCI device to pass through to VMs. This is done
using the :oslo.config:option:`pci.passthrough_whitelist` option. For example,
to enable passthrough of a specific device using its address:
.. code-block:: ini
[pci]
passthrough_whitelist = { "address": "0000:41:00.0" }
Alternatively specify multiple PCI devices using whitelisting:
Refer to :oslo.config:option:`pci.passthrough_whitelist` for syntax information.
Alternatively, to enable passthrough of all devices with the same product and
vendor ID:
.. code-block:: ini
[pci]
passthrough_whitelist = { "vendor_id": "8086", "product_id": "10fb" }
passthrough_whitelist = { "vendor_id": "8086", "product_id": "154d" }
All PCI devices matching the ``vendor_id`` and ``product_id`` are added to
the pool of PCI devices available for passthrough to VMs.
If using vendor and product IDs, all PCI devices matching the ``vendor_id`` and
``product_id`` are added to the pool of PCI devices available for passthrough
to VMs.
Refer to :oslo.config:option:`pci.passthrough_whitelist` for syntax
information.
#. Specify the PCI alias for the device.
From the Newton release, to resize guest with PCI device, configure the PCI
alias on the compute node as well.
Configure a PCI alias ``a1`` to request a PCI device with a ``vendor_id`` of
``0x8086`` and a ``product_id`` of ``0x154d``. The ``vendor_id`` and
``product_id`` correspond the PCI device with address ``0000:41:00.0``.
Edit ``/etc/nova/nova.conf``:
In addition, it is necessary to configure the :oslo.config:option:`pci.alias`
option on the compute node too. This is required to allow resizes of guests
with PCI devices. This should be identical to the alias configured
:ref:`previously <pci-passthrough-alias>`. For example:
.. code-block:: ini
@ -157,14 +170,14 @@ Configure PCI devices (Compute)
Refer to :oslo.config:option:`pci.alias` for syntax information.
#. Restart the ``nova-compute`` service.
Once configured, restart the :program:`nova-compute` service.
Create instances with PCI passthrough devices
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---------------------------------------------
The ``nova-scheduler`` selects a destination host that has PCI devices
available with the specified ``vendor_id`` and ``product_id`` that matches the
``alias`` from the flavor.
The :program:`nova-scheduler` service selects a destination host that has PCI
devices available that match the ``alias`` specified in the flavor.
.. code-block:: console