1. SR-IOV概述
SR-IOV全称Single Root I/O Virtualization,是一种IO虚拟化技术。为了减少平台资源开销,PCI-SIG开发了SR-IOV技术。SR-IOV使多个系统镜像(System Image,SI) 能够共享PCI硬件资源。系统镜像SI指的是软件,例如用于执行应用程序的操作系统或I/O设备驱动程序。
所以,有了SR-IOV,一个物理PCIe设备就可以虚拟出多个虚拟PCIe设备,然后将虚拟PCIe设备直通到各虚拟机,以实现单个物理PCIe设备支撑多虚拟机的应用场景。
为了提高硬件资源利用率,在硬件和SI之间,插入一个叫做虚拟化中介(Virtualization medium,VI)的软件,VI可以是VMM或hypervisor,如下图。
VI拥有底层硬件的唯一所有权。每个SI可用的硬件资源跟workload或客户策略有关。这种方法可用于很多环境,但I/O密集型的workload会有严重的性能下降。每次I/O 操作都会被VI拦截和处理,增加了平台资源开销。
因此,SR-IOV技术的好处是:
- 避免VI参与主要数据移动操作——DMA、内存空间访问、中断处理等。通过Single Root PCI Manager (SR-PCIM) 控制SR-IOV资源配置和管理的标准化方法。通过在设备内配置大量 I/O Function来降低硬件要求和相关成本。将SR-IOV与其他 I/O 虚拟化技术(例如ATS地址转换服务 、ATPT技术以及中断重映射技术)集成,以创建强大、完整的 I/O 虚拟化解决方案。
下图是一个支持 SR-IOV 的平台示例。
SR-IOV通用平台配置由以下功能元素组成:
SR-PCIM (Single Root PCI Manager):软件,负责配置SR-IOV扩展能力、管理PF和VF、以及处理相关错误事件和整体设备的控制,例如功耗管理和热插拔服务。
可选的Translation Agent (TA):TA是负责将PCIe事务中的地址转换为相关平台物理地址的硬件 (或软硬件的组合)。TA可能包含Address Translation Cache (ATC) 以加速访问转换表。TA还可以支持Address Translation Services(ATS),它使PCIe Function能在DMA访问内存之前获得转换地址。
可选的Address Translation and Protection Table(ATPT):ATPT包含TA访问的一组地址转换,以处理PCIe请求——DMA Read、DMA Write或中断请求。
可选的Address Translation Cache (ATC):ATC可以存在于两个位置 – 位于TA内,可集成在RC内或位于其上方;或位于PCIe设备内。在 RC 中,ATC可以加速translation查找。在设备内,ATC通过ATS技术填充,表明它们包含转换地址的 PCIe 事务可能会绕过平台的 ATC,以提高性能而不影响与ATPT相关技术的好处。
可选的Access Control Services (ACS):ACS定义了PCIe拓扑中的一组控制点,以确定TLP是否应正常路由、阻塞或重定向。在支持SR-IOV的系统中,ACS可用于防止分配给VI或不同SI的设备的Function相互或配对设备进行通信。重定向可以允许Translation Agent在做出对等转发决定之前转换Upstream内存TLP地址。可选的ACS P2P Egress Control可以提供选择性阻塞。ACS受制于与ATS的交互。
Physical Function(PF):PF是一种PCIe function,它支持SR-IOV功能并且可由SR-PCIM、VI 或SI访问。
Virtual Function(VF):VF是一种轻量级PCIe function,可由SI直接访问。至少,与Function主要数据移动相关的资源可供SI使用。配置资源应限于受信任的软件组件,例如VI或SR-PCIM。一个VF可以由不同的SI串行共享,即一个VF可以分配给一个 SI,然后重置并分配给另一个SI。一个VF可以有选择地从一个PF迁移到另一个PF。迁移过程可通过PCIe定义的配置控制来推动。
与PF关联的所有VF必须与PF具有相同的设备类型(例如相同的网络设备类型或相同的存储设备类型)。
1.1 SR-IOV单个PF示例
为减少硬件成本,可以使用SR-IOV构建设备以支持单个PF和多个VF,如下图所示。
图中的示例为具有N个VF的PF。需要注意:
-
- PF是兼容PCIe的。PF命名PF M表示Function编号为M的PF。VF命名VF M,N 表示与PF M 关联的第N个VF。
VF是从1开始编号的
-
- ,因此与PF M关联的第一个VF是VF M,1。每个VF与PF共享许多公共配置空间字段。VF使用与PF相同的配置机制和header type。与给定PF关联的所有VF共享一个VF BAR集,并共享控制访问的 SR-IOV extended capability中的 VF Memory Space Enable(MSE)位到VF 存空间。InitialVFs和TotalVFs字段用于发现可以与PF关联的最大VF数。如果设备不支持VF迁移,则TotalVFs和InitialVFs应包含相同的值。如果Device支持VF迁移,则在读取TotalVFs时,PF必须返回可以分配给PF的VF 数量。对于这样的设备,当读取InitialVFs时,PF必须返回分配给PF的初始VF数。每个Function、PF和VF都分配有唯一的Routing ID。所有PCIe 和 SR-IOV 配置访问都假定是通过可信软件组件(例如VI或SR-PCIM)进行的。每个VF都包含一组非共享的物理资源(例如工作队列)。这些资源可以由SI直接访问,无需VI或SR-PCIM干预。一个或多个VF可以分配给每个SI。虽然此示例显示了PF内的单个ATC,
但ATC的存在是可选的
-
- ,不排除实现设备内每个VF的ATC。内部路由是特定实现的。虽然存在许多PF操作的使用模型,但常见的使用模型是使用PF来引导设备或平台,并严格在VI的控制下进行。
一旦配置了SR-IOV功能,VF能够分配给单个SI,PF将承担更多的监督角色。
- 例如,PF可用于管理特定设备的功能,例如对每个VF的资源分配、对共享资源的VF仲裁。
1.2 SR-IOV多个PF示例
上边介绍了支持单个PF的设备。在下图中,设备支持多个PF,并且每个PF都有一组自己的VF。
这种情况下:
- 每个PF可以分配0个或多个VF。设备内的每个PF的VF数量不需要相同。ARI扩展能力允许将Function分配给Function Group并定义如何配置Function Group仲裁。PF和VF可以分配给Function Groups并利用相关的仲裁功能。PF 和 VF 之间的内部路由是特定实现的。对于某些使用模型,所有PF可能是相同的设备类型。对于其他使用模型,每个PF可能代表不同的设备类型。
如前面的示例所示,PF和VF的数量可以根据使用模型而变化。为了支持广泛的选项,SR-IOV设备可以支持以下数量和组合的PF和VF:
- 使用Alternative Routing Identifier(ARI) 功能,设备最多可以支持256个PF。Function Number分配是特定实现的,并且在整个256 Function Number空间中可能是疏散的。PF只能与设备捕获的Bus Number相关联,如图 9-7。SR-IOV 设备可以使用多个Bus Number。VF 可以与设备总线号范围内的任何Bus Number相关联 - 捕获的总线编号加上由软件配置的任何其他Bus Number。
使用多个Bus Numbers使设备能支持非常多的VF – 最多可达Routing ID 空间的大小减去用于识别中间总线的位。如果软件没有配置足够的附加Bus Number,则为附加Bus Number实施的VF可能不可见。
ARI扩展能力使设备能支持多达256个Function。如果使用模型不需要超过256个Function,则强烈建议实现将所有Function、PF和VF放在捕获的Bus Number内,并且不需要额外的Bus Number来访问VF。
参考:PCI Express Base Specification Revision 5.0 Version 1.0
1614