Linux中如何判断SR-IOV是否打开

  • Post author:
  • Post category:linux


SR-IOV(Single Root I/O Virtualization and Sharing)是PCIe标准中引入的一个可选特性,它能够让一个物理PCIe设备(PF:Physical Function)衍生出多个虚拟PCIe设备(VF:Virtual Function),通常情况下,这些衍生出来的VF将会分配给不同的应用程序,或者虚拟机使用,达到设备共享的目的,从而最大化物理PCIe设备的利用率。

一般情况下,服务器的BIOS/UEFI(后面统称BIOS)配置中会有SR-IOV特性的开关,用于开启或者关闭对SR-IOV特性的支持。

即系统没有足够的MMIO资源用于SR-IOV。说白了,BIOS是否支持SR-IOV关键就是BIOS上电初始化的时候,是否有为支持SR-IOV特性的PCIe设备留有足够的MMIO地址空间给将来可能衍生出来的VF,否则可能由于VF无法获取到足够的MMIO地址空间,导致VF不工作。

判断一个PCIe设备是否有支持SR-IOV特性,可以直接在PCIe设备的配置空间的Extended Capability List中去查找,也可以在Linux命令行中直接通过lspci -vvs xxxx:xx:xx.x(PCI设备的Domain、Bus、Device和Function)查看,如果有SR-IOV特性,则会有类似如下的显示:

PCIe设备的配置寄存器中,SR-IOV Extended Capability相应的寄存器定义如下:

其中,通过读取VF BAR0 ~ VF BAR5(Base Address Register)可以知道SR-IOV特性打开(这时候会衍生出设定数量的VF)后,所有VF对应的BAR0 ~ BAR5需要的MMIO空间的总和,并且通过写该寄存器,可以设定给所有VF预留的MMIO地址空间(起始地址和大小)。BIOS在系统上电初始化的时候,会访问每个物理PCI设备的BAR0 ~ BAR5为物理PCI设备分配对应的MMIO地址空间。若BIOS支持SR-IOV特性,则还会继续通过PCIe Extended Capability List查找该PCI设备是否支持SR-IOV特性,如果支持,则访问对应的VF BAR0 ~ VF BAR5寄存器,为将来可能衍生出的VF预留足够的MMIO地址空间。

在Linux的sysfs文件系统中,每个PCI设备都有对应的目录,即/sys/bus/pci/devices/xxxx:xx:xx.x,该目录中有个resource文件,该文件中记录了分配给这个PCI设备的MMIO资源,通过内核源码的定义可以看到该文件中,各条记录对应的含义如下所示:

前面6条对应的是标准PCI配置空间中BAR0 ~ BAR5配置的MMIO资源,然后是Expansion ROM对应的MMIO资源,接下来6条(PCI_IOV_RESOURCES ~ PCI_IOV_RESOURCE_END)则是对应IO虚拟化的资源,对于支持SR-IOV特性的设备而言,就是对应了SR-IOV Extended Capability寄存器中的VF BAR0 ~ VF BAR5,对应到resource文件的第8 ~ 13行。

例如,对于一个支持SR-IOV特性的设备而言,当BIOS中打开SR-IOV的时候,对应设备resource文件的第8 ~ 13行(每行对应的是MMIO的起始地址、终止地址和一些控制位)就不全为零,说明BIOS有为可能衍生的VF预留MMIO资源。

并且打开SR-IOV后,衍生出的VF对应的BAR0 ~ BAR5的MMIO资源也正好落在BIOS为PF SR-IOV特性预留的MMIO空间中。

当在BIOS中将SR-IOV关闭后,虽然通过lspc -vvs xxxx:xx:xx.x还是可以看到该设备带有SR-IOV特性,但是该设备SR-IOV特性对应的VF BAR0 ~ VF BAR5就都全为0,说明BIOS没有给SR-IOV特性预留MMIO资源。

所以,总的来说,可以通过如下方法在Linux中判断BIOS是否有打开SR-IOV:找一个支持SR-IOV特性的设备,查看BIOS是否为该设备的SR-IOV特性预留MMIO资源(resouce文件的第8 ~ 13行是否全为0),若有预留资源,则说明BIOS中SR-IOV特性已经打开,若没有,则说明BIOS没有打开SR-IOV特性。

原文链接

https://zhuanlan.zhihu.com/p/561002399



版权声明:本文为lingshengxiyou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。