pcie SRIOV linux 调用流程

sriov_init初始化和pci_enable_sriov使能vf 在drivers/pci/probe.c 中的pci_init_capabilities函数中调用pci_iov_init 来进行sriov的初始化 int pci_iov_init(struct pci_dev *dev) { int pos; if (!pci_is_pcie(dev)) return -ENODEV; pos = p 阅读详情

背景

当前的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
[PCIe] SR-IOV (单根虚拟化) 及linux驱动浅析(device的PF和VF及其驱动) 检查、配置vf数量,因为还没配置,所以是0 [root@g1 ~]# cat /sys/class/infiniband/mlx5_1/device/mlx5_num_vfs 0 这里我测试把OFED驱动中的vf数量配置成1 echo 1> /sys/class/infiniband/mlx5_1/device/mlx5_num_vfs 在PCI总线上,用lsp... 阅读详情

相关推荐

linux下pcie库函数,​Linux下C如何调用PCI Lib函数

Linux下C如何调用PCI Lib函数在Linux下,可以通过"setpci"和"setpci"命令来访问PCI设备的配置空间,那么能否用程序来访问PCI 配置空间呢?答案当然是肯定的,linux下提供了多个pci库以供应用程序访问。下面就以最常见的为例,从安装、使用和编译的角度分别进行说明。安装在centos中,用超级用户权限,可用下面的命令查看到和pci访问相关的库包括:libpciacce...

weixin_39637457的博客 1194

2021, Dec日志-关于PCIe的AER

PCIe定义了很多的Cap. 但大多数人只用到了其中一些最常用的,比如MSI/MSIX, PMC, ARI, PCI express, PASID等等 还有很多Cap, 没有深入了解的实践机会, 比如LTR, OBFF, TPH, 等等,等等,非常之多。 另外一些Cap,比如AER, DPE/eDPC, ACS, ATS, SRIOV有一点点了解。 ATS, PASID可以看成TA(translation agent), ATPT(address trans and protection t..

3302

PVE8直通核显(N100),并开启虚拟化Sriov

PVE8直通N100核显,并开启虚拟化Sriov,实现一个显卡直通给多个虚拟机

Abin17618的博客 3万+

MSTAR数据集下载地址及处理方法

首先感谢博主冯子材提供下载的百度网盘地址。 在这里为了防止侵权,特此鸣谢,并给出其博客地址。 地址中有MSTAR百度网盘下载地址和需要使用的数据介绍,其中百度网盘中有数据转换工具 https://blog.youkuaiyun.com/taifengzikai/article/details/80600355 工具使用 因为下载得到的数据是二进制文件,需要使用官方提供的工具进行转换,可将其转换为jpeg。 有...

KamenRider 1万+

ESP32-IDF HTTP服务器实战:从零搭建Web控制界面

本文详细介绍了如何在ESP32平台上使用ESP-IDF框架从零搭建HTTP服务器,并创建Web控制界面。内容涵盖环境配置、服务器基础设置、Web页面处理、GPIO控制接口实现及AJAX异步请求处理,帮助开发者快速掌握物联网设备Web控制开发。

efc123456的博客 1063

【k8s实战】 在离线项目混部 通过kubeflow(tf-operator)部署TensorFlow机器学习任务+prometheus/grafana监控资源使用全过程(最新 图文)

目录在离线混合部署概念最新版kubeflow部署TensorFlow部署二级目录三级目录 在离线混合部署概念 先举一个例子,众所周知的天猫双十一当天的流量非常之大,那么就需要成百上千台服务器构成一个超大集群来提供计算能力,但是双十一过去之后,集群资源就面临着浪费的局面。假设业务分为在线和离线两种模式:在线任务需要资源相对较少,但要求响应时间短;离线任务则不需要对任务进行迅速响应,但是计算量相对较大、占用资源多。那么我们应该怎么在K8S集群上完成这两种业务的部署、并且使得CPU利用率始终维持在一个比较高的水平

Eros1on的博客 1546

LC整流滤波电路DIY:电感电容配合,手把手搭建低纹波直流电源

在直流电源设计中,整流滤波是连接交流输入与稳定输出的关键环节。常见的电容滤波虽然简单,但在大负载下纹波抑制能力有限,电感抵抗电流突变、电容抵抗电压突变,二者组合构成的LC滤波能有效降低输出电压纹波,同时减小开机浪涌电流。在工频线性电源、功放电源等对噪声敏感的场景中,LC滤波常作为稳压前的平滑缓冲。本文以一套完整DIY项目为线索,介绍整流桥后串联功率电感、并联滤波电容的电路构成,结合实际计算与波形测试,讨论电感量估算、电容选取、谐振风险、饱和电流等工程问题,并给出上电测试和故障排查方法。通过搭建与调试,可直观

weixin_29168813的博客 377

软件各项会议评审意见模版

读梅老师主编的书,觉得评审意见模板很有参考价值和实用价值,帮梅老师安利一波,顺便记一下笔记。 《系统/子系统规格说明》评审意见模板 20XX年XX月XX日,XXX(主管机关)在XXX(会议地点)主持召开了“《XXX(产品名称)系统规格说明》评审会”。参加会议的有XXX机关,XXX院校,XXX研究所共XX名代表(名单见附件1),会议成立了评审组(名单见附件2),听取了XXX(单位)做的《XXXX报告》。经讨论质询,形成评审意见如下: 系统规格说明对系统的研制目标和范围、工作状态、运行方式以及所要满足的能力需

赵星汉同学的博客 1万+

chipseeker Y叔

这一次讲解非常重要的peak注释,注释在ChIPseeker里只需要用到一个函数annotatePeak,它可以满足大家各方面的需求。 输入 当然需要我们上次讲到的BED文件,ChIPseeker自带了5个BED文件,用getSampleFiles()可以拿到文件的全路径,它返回的是个named list,我这里取第4个文件来演示。annotatePeak的输入也可以是GRanges对象,你如果用R做peak calling的话,直接就可以衔接上ChIPseeker了。 require(ChIPseeke

生信小博士的博客 1589

手把手教你学Simulink——基于Simulink的隔离型DC-DC全桥变换器移相控制建模示例

本文详细介绍了基于Simulink的全桥移相变换器(PSFB)建模与控制方法。首先分析了全桥移相拓扑在大功率应用中的优势,包括ZVS实现、高频化和小型化特点。随后给出了具体设计参数和移相控制策略,采用电压外环+移相角内环的双闭环控制架构。文章重点演示了Simulink建模步骤,包括主电路搭建、移相PWM生成和PI控制器设计,并通过满载稳态、负载阶跃和轻载测试三种场景验证了系统性能。最后总结了工程实践要点,提出自适应控制等扩展方向,强调移相控制通过精准时间管理实现高效能量转换的核心价值。

MHD0815的博客 261

uniapp [全端兼容] - 实现内网使用天地图离线地图,详解项目加载天地图的离线地图服务器部署与使用教程示例源码,Uniapp如何实现天地图的离线加载部署在内网访问(兼容H5、微信小程序、App)

uniapp天地图如何离线访问,无需网络调用天地图API,天地图离线地图,天地图——内网使用离线地图,uniapp中加载天地图的离线地图,uniAPP实现天地图离线访问,在内网中无法直接使用外网天地图资源怎么办,在uni-app中加载地图 -使用天地图的瓦片数据。UNIAPP天地图离线怎么使用,内网部署天地图,天地图离线瓦片,部分瓦片数据,天地图如何离线,下载天地图离线服务,并用Uniapp+天地图离线部署,天地图私有化部署,实现离线加载天地图,Java+uniapp天地图离线开发,uniapp项目中无网络

🏆 前端领域优质创作者 4902

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: PCIE扫描过程
下一篇: x86 pci bus 初始化流程
Runner_Linux
博客等级 码龄6年 17粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值