diff --git a/specs/queens/approved/enable-sriov-nic-features.rst b/specs/queens/approved/enable-sriov-nic-features.rst new file mode 100644 index 000000000..6bc9ee761 --- /dev/null +++ b/specs/queens/approved/enable-sriov-nic-features.rst @@ -0,0 +1,279 @@ +.. + This work is licensed under a Creative Commons Attribution 3.0 Unported + License. + + http://creativecommons.org/licenses/by/3.0/legalcode + +=========================================== +Enable SR-IOV NIC offload feature discovery +=========================================== + +https://blueprints.launchpad.net/nova/+spec/enable-sriov-nic-features + +Today, most networking hardware vendors implement some of the TCP/IP stack, +traditionally done by the host operating system, in the NIC. Offloading +some of these functions to dedicated hardware frees up CPU cycles for +applications running on the system. + +``libvirt`` implemented the SR-IOV NIC offload feature discovery in version +1.2.14 [1]_. + +Problem description +=================== + +NIC features, in particular features around various hardware offload, are +useful for network-intensive applications. Unfortunately, Nova doesn't yet +retrieve physical NIC information from the system, which means the scheduler +cannot filter out compute hosts that do not contain certain NIC features. + +If a virtual machine, during the booting step, discovers a NIC offload +feature, Nova Scheduler can select those hosts that have PCI devices with that +feature. + +The aim of this spec is to fill this gap by proposing a method to read this +information, store it, use it during the scheduling process and provide a way +to share this information with Neutron. + +Use Cases +--------- + +* An NFV MANO/VNFM system needs to ensure that a particular network I/O + intensive workload is launched on a compute host with SR-IOV NIC hardware + that has some specific hardware offload features (e.g. TSO and checksumming). + + +Proposed change +=============== + +This spec proposes to implement the following changes in Nova: + +* A method to read the NIC feature information. +* A method to store this information in the Nova DB. +* How Nova Scheduler PCI filter will match this new information. + +Also in this spec will be described how a Neutron port must be defined to +include these NIC features. This information will be added to the OpenStack +manuals and devref. + +NIC feature information +----------------------- + +The libvirt API currently provides the feature list of a NIC device. Using the +command line utility we can retrieve the following information :: + + $ virsh nodedev-dumpxml net_ens785_68_05_ca_34_83_60 + + net_ens785_68_05_ca_34_83_60 + /sys/devices/pci0000:00/0000:00:02.0/0000:02:00.0/net/ens785 + pci_0000_02_00_0 + + ens785 +
68:05:ca:34:83:60
+ + <-- example of NIC feature + + + + + + + + + + + + +
+ + +The parent of a NIC device is always a unique PCI device and the only child of +this PCI devide is the NIC device. This spec proposes to add a new member to +``nova.virt.libvirt.config.LibvirtConfigNodeDevicePciCap`` class, called +'net_features'. This member will be a list of strings, e.g., +'HW_NIC_OFFLOAD_RX', 'HW_NIC_OFFLOAD_TSO' or 'HW_NIC_OFFLOAD_RSHASH'. This list +is empty by default. If a PCI device is not a NIC interface or doesn't have any +feature, the list will remain empty. + +Store the NIC features information +---------------------------------- + +No changes are needed in the database. The NIC information per PCI device will +be stored in ``pci_devices.extra_info`` under a dictionary labeled +``capabilities``. This dictionary will contain all discovered PCI capabilities, +grouped in types. In this case, because the features are related with +networking capabilities, these will be contained in a list called ``network`` +:: + + extra_info: {'capabilities': + {'network': ['HW_NIC_OFFLOAD_RX', 'HW_NIC_OFFLOAD_SG', + 'HW_NIC_OFFLOAD_TSO', 'HW_NIC_OFFLOAD_TX']} + } + + +As seen in the example above, the strings representing network capabilities are +traits belonging to ``os-traits`` project. Those traits are located under +``os_traits.hw.nic`` directory [2]_. Any other string not found in +``os-traits`` will be discarded from ``capabilities:network`` list and a +warning message will be logged, but no exception will be risen. + +Neutron port ``binding:profile`` +-------------------------------- + +The Neutron data model and API is already defined. No modifications in Neutron +project are needed. + +E.g., how to define a Neutron port and request some specific NIC features, +defined in the binding profile :: + + $ openstack port create --binding-profile + '{"capabilities": ["HW_NIC_OFFLOAD_RX", "HW_NIC_OFFLOAD_TSO"]}' + --network private port1 + + +Nova Scheduler filter ``PciPassthroughFilter`` +---------------------------------------------- + +As it works now, the PCI request information during the boot of a virtual +machine will come both from the PCI alias information provided in the flavor +and the Neutron port definition passed in the boot command. With this feature, +the Neutron port would be able to contain a list of NIC features. + +To add this new parameter to the filter, ``PciDeviceStats`` PCI device pools +will contain a new tag key ('capabilities.network'). Because every virtual +function in the pool belongs to the same PCI device, all of them have the same +NIC features. + +If the PCI request spec from a Neutron port has a ``capabilities_network`` +parameter, the filter will try to match this value with the one stored in the +PCI device pools. + +``capabilities_network`` parameter in both the request spec and the PCI device +stats are lists. Currently the PCI passthrough filter only matches string +parameters [3]_. This spec proposes to change this matching function to accept +both strings and lists: + +* If a string is passed, the function will pass if both strings are equal. +* If a list is passed, the function will pass if all elements in the request + spec list are contained in the PCI device pool list. + + +Alternatives +------------ + +* To create a new member in Neutron ``port``, containing the feature + information as a list of strings. However, this change doesn't add any value + because currently there is a place, ``binding:profile``, to define and + store this information. + +Data model impact +----------------- + +None. + +REST API impact +--------------- + +None. + +Security impact +--------------- + +None. + +Notifications impact +-------------------- + +None + +Other end user impact +--------------------- + +None + +Performance Impact +------------------ + +The Nova Scheduler ``PciPassthroughFilter`` needs to include the 'NIC features' +parameter into the checking loop, adding an extra time per host checked. In +return, the list of passed hosts could be shorter because of the new +restrictions. + +Other deployer impact +--------------------- + +``libvirt`` implemented the SR-IOV NIC offload feature discovery on version +1.2.14 [1]. + +Developer impact +---------------- + +None + +Implementation +============== + +Assignee(s) +----------- + +Primary assignees: + Rodolfo Alonso + Sean K Mooney + +Work Items +---------- + +1. Implement a method to read the NIC feature information. +2. Implement a method to store this information in the Nova DB. +3. Design how Nova Scheduler PCI filter will match this new information. +4. Add documentation illustrating how to correctly use filter and sort params + when listing servers. +5. Add enough documentation to NFV MANO manuals and devref. +6. When Resource Provider project is fully implemented, migrate this feature + and add all NIC features to os-traits. + +Dependencies +============ + +None + +Testing +======= + +Few unittest needs to be adjusted to work correctly. All the unittest and +functional should be passed after the change. + +Once the third-party CI with specific hardware is added to Jenkins, new tests +will be added. + +Documentation Impact +==================== + +The devref needs to describe: + +* Which new information is added to ``pci_devices`` and where is obtained. +* How to define the new parameters in the Nova Flavor extra specs fields. +* How to define a new Neutron port with these new parameters. + +Neutron docs SR-IOV section must also contain this information. + +References +========== + +.. [1] `https://libvirt.org/news-2015.html` + +.. [2] `https://github.com/openstack/os-traits/tree/0.3.3/os_traits/hw/nic` + +.. [3] `https://github.com/openstack/nova/blob/master/nova/pci/utils.py#L39-L54` + +History +======= + +.. list-table:: Revisions + :header-rows: 2 + + * - Release Name + - Description + * - Pike + - Approved + * - Queens + - Reintroduced