pcie SRIOV linux 调用流程

本文深入探讨了SR-IOV技术,一种增强I/O虚拟化的方法,通过为每个虚拟机提供独立的内存空间、中断和DMA流,实现绕过VMM的数据移动,提高I/O效率。介绍了SR-IOV的实现原理、配置过程及硬件软件条件。

背景

当前的I/O虚拟化技术有其优点和缺点。没有一个是基于任何行业标准的。
业界认识到可替代架构的问题,并正在开发可共享的新设备。这些设备复制每个VM所需的资源,以便直接连接到I/O设备,这样就可以在不涉及VMM的情况下进行数据移动。

本机共享设备通常为它们公开的每个接口提供惟一的内存空间、工作队列、中断和命令处理,同时利用主机接口背后的公共共享资源。这些共享资源仍然需要进行管理,通常将一组管理寄存器公开给VMM中的可信分区。见图1。
在这里插入图片描述
Figure 1. Natively and Software Shared

通过拥有独立的工作队列和命令处理,这些设备能够同时接收来自多个源的命令,并在将它们传递到次要结构(例如,以太网或SAS链接)之前将它们合并在一起。虚拟化软件不再需要将I/O请求多路复用到串行流中。
本地共享设备可以通过多种方式实现,包括标准化的和专有的。由于大多数这些设备是通过PCI访问的,PCI- SIG决定创建一个标准方法。PCI-SIG SR-IOV规范定义了创建本机共享设备的标准化机制。
图1显示了一个可能的示例配置,其中三个虚拟机通过虚拟函数原生(直接)访问以太网控制器中的专用资源,同时物理函数也有自己的资源。

1.1 SR-IOV Goals

PCI-SIG SR-IOV规范的目标是通过为每个虚拟机提供独立的内存空间、中断和DMA流来标准化绕过VMM参与数据移动的方法。SR-IOV体系结构的设计目的是允许设备支持多个虚拟功能(VFs),并将大量注意力放在最小化每个附加功能的硬件成本上。
SR-IOV引入了两种新的函数类型:

  1. 物理功能(PFs):这些是完整的PCIe功能,包括SR-IOV扩展功能。该功能用于配置和管理SR-IOV功能。
  2. 虚拟功能(VFs):这些是“轻量级”PCIe函数,包含数据移动所需的资源,但配置资源的集合被精心最小化。

1.2 SR-IOV概述

虚拟化的直接分配方法提供了非常快的I/O。但是,它阻止了I/O设备的共享。SR-IOV提供了一种机制,通过这种机制,单个根函数(例如单个以太网端口)可以看起来是多个独立的物理设备。
能够支持SR-IOV的设备可以配置(通常由VMM配置),使其在PCI配置空间中作为多个功能出现,每个功能都有自己的配置空间,带有基址寄存器。VMM通过将实际配置空间VFs映射到VMM提供给虚拟机的配置空间,将一个或多个VFs分配给VM。参见图2。
在这里插入图片描述
Figure 2. Mapping VF Configuration

支持SR-IOV的设备提供许多可配置的独立VFs,每个VFs都有自己的PCI配置空间。VMM将一个或多个VF分配给虚拟机。内存转换技术,如Intel®VT-x和Intel®VT-d提供硬件辅助技术,允许直接DMA传输到和从VM,从而绕过VMM的软件切换。

2.2 SR-IOV 的条件

硬件条件:
1. CPU 支持 Intel VT-x 和 VT-D (或者 AMD 的 SVM 和 IOMMU) 
2. 有支持 SR-IOV 规范的设备:目前这种设备较多,比如Intel的很多中高端网卡等。
3. CPU必须支持IOMMU(比如英特尔的 VT-d 或者AMD的 AMD-Vi,Power8 处理器默认支持IOMMU),并且在BIOS中已开启。
4. 支持PCI-SIG* Single Root I/O Virtualization and Sharing(SR-IOV),并且在BIOS中已开启。
软件条件:
  1. 需要 QEMU/KAM 的支持。
  2. 安装软件包
    yum install -y kvm virt-* libvirt bridge-utils qemu-img
    kvm:软件包中含有KVM内核模块,它在默认linux内核中提供kvm管理程序
    libvirts:安装虚拟机管理工具,使用virsh等命令来管理和控制虚拟机。
    bridge-utils:设置网络网卡桥接。
    virt-*:创建、克隆虚拟机命令,以及图形化管理工具virt-manager
    qemu-img:安装qemu组件,使用qemu命令来创建磁盘等。

查看系统是否支持虚拟化,egrep -c ‘(vmx|svm)’ /proc/cpuinfo
大于1表示开启了,等于0表示没开启,如果没开启则需要在BIOS中开启intel VT-d
查看kvm模块是否被加载lsmod |grep kvm,如果有信息,则表示加载成功。
Centos系统默认没有启动IOMMU功能,在grub文件的GRUB_CMDLINE_LINUX后面添加intel_iommu=on
检测是否生效 sudo virt-host-validate

RedHat Linux 官方提供了详细的流程:

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/virtualization_host_configuration_and_guest_installation_guide/index

网上这方面资料还是比较多的:
https://www.cnblogs.com/sammyliu/p/4548194.html

https://www.cnblogs.com/liuhongru/p/11068460.html

https://blog.youkuaiyun.com/u010443710/article/details/104756445?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.edu_weight

3.0 kernel 代码流程

查看是否支持SR-IOV:

lspci -vvs bus:dev.fun, 如果有类似下面的capability,说明支持SR-IOV, 并能看出来支持几个VFs等详细信息。
在这里插入图片描述

通过下面的命令来enable SRIOV功能:

echo 2 > /sys/bus/pci/devices/0000:5e:00.0/sriov_numvfs
上面红色的是一个支持SR-IOV功能的pcie 网卡,2是enable的数量,从下图看,enable了2个VFs后,多出来了2个pcie设备。
在这里插入图片描述

enable SR-IOV的流程:

从上面命令上看,入口是每个pcie的sriov_numvfs节点,下面是实现节点的代码:

/*
 * num_vfs > 0; number of VFs to enable
 * num_vfs = 0; disable all VFs
 *
 * Note: SRIOV spec doesn't allow partial VF
 *       disable, so it's all or none.
 */
static ssize_t sriov_numvfs_store(struct device *dev,
				  struct device_attribute *attr,
				  const char *buf, size_t count)
{
   
   
	struct pci_dev *pdev = to_pci_dev(dev);
	int ret
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值