将晦涩难懂的技术讲的通俗易懂
分类: LINUX
2021-09-04 19:26:16
Scalable IOV(有些场景称为SIOV)是IO虚拟化技术的一个演进,是SR-IOV的进一步发展。为了提升虚拟机的IO性能,intel 的VT-d解决了设备直通问题,使虚拟机可以直接访问硬件设备从而提高性能,而SR-IOV则提供了设备共享的能力,通过将设备硬件虚拟化出多个VF给不同的虚拟机使用。
首先我们回顾一下SR-IOV技术,如下图所示,SR-IOV引入了两种设备PF和VF。其中PF具有完整的PCIe功能,包括VF的管理(创建/删除/配置),VF则是一种轻量的PCIe设备,只有部分数据传输功能,不包含资源管理和配置管理。但VF也是标准的PCIe设备,既有唯一的BDF(Bus,Device,Function)来标识这个设备,拥有属于自己的PCIe配置空间。
虽然SR-IOV同时解决了设备直通和共享问题,但是也具有一定局限性:
1. SR-IOV支持的最大设备数量相对较少。理论上一个PCIe物理设备最多只能虚拟出256个VF设备(BDF中Function有8位),但是从设备本身的资源或BIOS枚举需要预留的地址空间来讲,往往连这个数量也无法达到,而另一方面容器等技术的兴起,对网卡的密度要求越来越高。
2. 无法支持动态的资源管理,一方面,如上所述,一个支持SR-IOV的设备即使没有生成VF,BIOS在枚举PCIE设备时也会保留足够大的PCIe空间一遍后续生成VF使用
3. 无法支持热迁移,由于SR-IOV是直接设备硬件透传给虚拟机的,所以很难像virtio一样友好的支持热迁移
针对SR-IOV的一些局限性,intel推出了Scalable IOV技术。它主要包含一些几个技术特性:
1. 硬件辅助的直通架构,具体来说就是
(1)慢速路径有软件模拟完成,所谓慢速路径一般指设备的配置,接口的管理,而快速路径则是指IO的数据传输路径。在SR-IOV中,慢速路径和快速路径都是通过硬件直通的方式完成的;
(2)快速路径资源可以动态分配,映射;
(3)硬件保证快速路径的资源在DMA时是完全隔离的,保证不同虚拟设备的安全隔离;
2. 更加细粒度的动态资源配置。具体来说就是可以按照PCIe设备上的tx/rx queue pair来切分虚拟设备,而不是VF,从而实现更细粒度的资源分配;
3. 利用PASID(Process Address Space ID)的PCIe能力,PASID技术也是PCI协议的一个补充,它颠覆了传统通过BDF(Bus,Device,Function)来唯一标识一个PCIe设备的方式,以BDF+PASID在一个PCIe设备内细分更多的虚拟设备;
4. 支持各种IO设备,包括网卡,存储设备,GPU,各种加速器等;
5. 支持虚拟机,裸金属,容器等多种应用场景;
以上就是Scalable IOV的主要技术特征,可以看出和SR-IOV类似,它不仅仅是PCIe设备侧的一次革新,更是硬件设备,BIOS,操作系统,hypervisor,CPU,IOMMU等整个硬件的一次革新。
Scalable IOV的整体架构和构成如下图所示。Scalable IOV主要分为三层:设备层,平台层,软件层。
设备层提出了一种叫ADI(Assignable Device Interfaces)的接口概念,这个有些类似于SR-IOV中的VF,ADI指作为一种独立的单元进行分配、配置和组织的一组后端资源。它和VF有两点不同之处:
1. 没有PCI配置空间,所有ADI设备共享PF的配置空间;
2. 通过PASID标识,而不是BDF
同时ADI作为一个可用随时分配的设备,又具备以下特点:
1. ADI设备之间是完全隔离的,不共享任何资源;
2. 不同的ADI设备的MMIO寄存器是以物理页为单位隔离,保证进行MMIO页映射时在不同的页,避免MMIO被不同的进程共享;
3. 所有ADI的DMA操作通过PASID进行,因此IOMMU可以根据每个设备DMA的PASID查找不同的页表,保证物理上ADI是安全隔离的;
4. 采用了Interrupt Message Storage(IMS)技术。其实IMS和ADI不是绑定的,ADI采用IMS是由于往往ADI设备较多,每个ADI设备的每个queue都会产生中断,为了支持大量的中断消息存储使用了IMS技术。至于IMS具体的存储格式和位置是和具体设备实现相关的。此外ADI中断不支持共享,而且只支持MSI/MSI-X,不支持lagacy中断;
5. 每个ADI设备可以独立的进行reset操作;
PCI配置空间
对PCIe设备进行初始化和枚举时,需要配置空间能够发现设备是否支持Scalable IOV技术,intel定义了一个Designated Vendor Specific Extended Capability (DVSEC) 域用于发现和配置支持Scalable IOV技术的设备。具体如下图所示:
DMA remapping的扩展
IOMMU提供DMA remapping的操作,进行地址转换,将不同的IO设备提供的IOVA地址转换成物理地址,用于设备的DMA。在intel IOMMU中,每个IO设备通过BDF找到属于自己的页表。为了支持Scalable IOV,DMA remapping增加了PASID的支持,其多级页表也进行了重新设计,具体如下图所示:
在软件层intel引入了Virtual Device Composition Module (VDCM)的概念,通过VDCM来实现设备的管理和intercepted path(慢速路径)的处理。如下图所示,VDCM可以作为一个模块在Host上,也可以在一个单独的嵌入式设备中(如smartNIC上)。其主要功能有两个:在ADI和虚拟设备(VDEV)之间建立映射关系,处理和仿真慢速路径的操作。
除此之外还需要一个软件框架来完成VDEV设备声明周期的管理,对VDEV资源访问进行安全控制和管理,服务来自虚拟机、容器的慢速路径的请求。这些都需要大量的开发工作,为此intel巧妙的复用了目前linux内核已经推出的Mediated Device Framework。
Mdev framework
Mediated Device最初是linux为GPU设计的,因为当时GPU还不支持SR-IOV,所以为了实现设备的安全隔离实现了这个框架。但是目前越来越多的其他技术开始利用这套框架实现设备的隔离和软件的仿真。通过利用这个框架intel将Scalable IOV虚拟出来的VDEV设备做成mdev设备,节省了开发时间,同时也针对原有的mdev framework做了一定扩展。如下图所示:
Scalable IOV技术作为SR-IOV的下一代技术具有更高的灵活性同时可以支持更多的设备,更高的密度。其实其思想和vDPA类似,都是通过将设备的slowpath和fastpath分离,只不过Scalable IOV解决的是设备虚拟化的问题,而vDPA解决的是设备仿真的问题。Scalable IOV和vDPA在智能网卡和DPU中均具有很重要的应用价值。