SR-IOV(三)
Physical Function (PF)
- 简而言之,这是基本规范定义的PCI功能(Function)的名称。
- 具有SR-IOV能力的PF负责用于配置IOV功能以及管理PF功能。
- 这些PF由上一篇文章提到的SR PCIM用于管理虚拟功能VF。
Virtual Function (VF)
- 简而言之,就是虚拟化后的功能的名称。
- VF有自己的Bus、device和Function号和自己的BAR地址。
- SI可以直接访问这些功能上的资源。
- VF由SR-PCIM创建/管理。
- 一个VF只与一个PF相关联。
- VF创建后,可以通过RC(Root Complex)按照传统PCIe方法进行配置和访问。
Physical Function 被SR-PCIM来管理配置虚拟化VF功能。
Physical Function 0 (PF0) 通常还负责设备的物理层的行为和属性,如物理层错误以及link事件响应等。
SR-IOV规范对于支持SR-IOV的Phyesical Function增加了一个新的能力寄存器(SR-IOV Capability)用于管理、配置、使能SR-IOV能力。例如,下图截取了Intel 82599的相关SR-IOV能力寄存器的定义:
下图是Spec定义的SR-IOV能力寄存器的完整定义:
在Linux下,内核是支持SR-IOV特性的。每个支持SR-IOV的设备厂商的驱动往往也是两个,一个是基本PF驱动,一个是虚拟VF驱动。比如Intel的网卡驱动包括:ixgbe-5.3.7.tar.gz, ixgbevf-4.3.5.tar.gz。如果需要使用VF,需要加载ixgbevf驱动。
举个例子,Intel 82599有两个原生的PF,我们如果需要在一个PF下创建一个VF,则加载驱动方式如下:
modprobe ixgbe max_vfs=1,1
如果想在两个PF上分别创建3个VF,4个VF,参数修改为max_vfs=3,4
打开日志。我们可以看到:
[root@localhost ~]# modprobe ixgbe max_vfs=1,1
[root@localhost ~]# dmesg
[ 128.279468] Intel(R) 10GbE PCI Express Linux Network Driver - version 5.3.7
[ 128.279475] Copyright(c) 1999 - 2018 Intel Corporation.
[ 128.301008] ixgbe: I/O Virtualization (IOV) set to 1
[ 128.301018] ixgbe: 0000:07:00.0: ixgbe_check_options: FCoE Offload feature enabled
[ 129.368851] ixgbe 0000:07:00.0: Enabling SR-IOV VFs using the max_vfs module parameter is deprecated.
[ 129.368861] ixgbe 0000:07:00.0: Please use the pci sysfs interface instead. Ex:
[ 129.368871] ixgbe 0000:07:00.0: echo '1' > /sys/bus/pci/devices/0000:07:00.0/sriov_numvfs
[ 129.469727] pci 0000:07:10.0: [8086:10ed] type 00 class 0x020000
[ 129.469845] pci 0000:07:10.0: can't set Max Payload Size to 256; if necessary, use "pci=pcie_bus_safe" and report a bug
[ 129.470141] iommu: Adding device 0000:07:10.0 to group 5
[ 129.470331] ixgbe 0000:07:00.0: SR-IOV enabled with 1 VFs
[ 129.470339] ixgbe 0000:07:00.0: configure port vlans to keep your VFs secure
[ 129.470406] ixgbe 0000:07:00.0: FCoE offload feature is not available. Disabling FCoE offload feature
上面驱动成功对每一个PF都创建、使能了一个VF。
[ 129.508940] ixgbevf 0000:07:10.0: enabling device (0000 -> 0002)
[ 129.564099] ixgbevf 0000:07:10.0: PF still in reset state. Is the PF interface up?
[ 129.564111] ixgbevf 0000:07:10.0: Assigning random MAC address
[ 129.564220] ixgbevf 0000:07:10.0: irq 148 for MSI/MSI-X
[ 129.564241] ixgbevf 0000:07:10.0: irq 149 for MSI/MSI-X
[ 129.564286] ixgbevf 0000:07:10.0: Multiqueue Disabled: Rx Queue count = 1, Tx Queue count = 1
[ 129.565015] ixgbevf 0000:07:10.0: 92:31:0c:eb:c5:99
[ 129.565022] ixgbevf: eth1: ixgbevf_probe: Intel(R) 82599 Virtual Function
[ 129.565026] ixgbevf: eth1: ixgbevf_probe: GRO is enabled
[ 129.565030] ixgbevf: eth1: ixgbevf_probe: Intel(R) 10GbE PCI Express Virtual Function Driver
而VF驱动访问这些VF的方式,包括资源访问、MSI中断分配等等都跟PF无任何差异。
最后,对于SR-IOV协议来讲。SR-IOV规范的核心是PCI Express基本规范。 所有IOV实现必须符合PCI Express基本规范。SR-IOV规范在基于PCIe base spec的基础上做了增加和补充。而MR-IOV规范是在SR-IOV规范基础上增加了新的支持Multi RootComplex的内容。换句话说,支持MR-IOV的设备一定是支持SR-IOV的。
另外,对于CPU支持虚拟化的规范,不是PCI-SIG的责任范畴,不同架构体系的CPU的实现方式和规范都不一致。