不同的PMD可能需要不同的内核驱动程序才能正常工作。根据所用的PMD,应加载相应的内核驱动程序并将其绑定到网络端口。
1. UIO
一个小的内核模块,用于设置设备,将设备内存映射到用户空间并注册中断。在许多情况下,Linux内核中包含的标准uio_pci_generic模块可以提供uio功能。可以使用以下命令加载该模块:
sudo modprobe uio_pci_generic
注意:
uio_pci_generic模块不支持虚拟函数的创建。
作为uio_pci_generic的替代,DPDK还包括igb_uio模块,该模块可在上述kmod子目录中找到。可以如下所示加载它:
sudo modprobe uio
sudo insmod kmod/igb_uio.ko
注意
从DPDK v20.02开始默认禁用igb_uio模块。要构建它,应启用配置选项CONFIG_RTE_EAL_IGB_UIO。计划将igb_uio模块移动到其他git存储库。
注意
对于某些不支持传统中断的设备,例如如果使用虚拟功能(VF)设备,则可能需要使用igb_uio模块代替uio_pci_generic。
注意
如果启用了UEFI安全启动,则Linux内核可能会禁止在系统上使用UIO。因此,用于DPDK的设备应绑定到vfio-pci内核模块,而不是igb_uio或uio_pci_generic。有关更多详细信息,请参见下面的将网络端口绑定到内核模块和从内核模块解除绑定。
注意
如果用于DPDK的设备绑定到uio_pci_generic内核模块,请确保IOMMU已禁用或直通。可以在x86_64系统上的GRUB命令行中在inommu = pt上添加intel_iommu = off或amd_iommu = off或intel_iommu = on或intel_iommu = on,或者在aarch64系统上添加iommu.passthrough = 1。
由于DPDK 1.7及更高版本提供VFIO支持,因此对于支持使用VFIO的平台,可以选择使用UIO。
2. VFIO
与UIO相比,依靠IOMMU保护,驱动程序更强大,更安全。要使用VFIO,必须加载vfio-pci模块:
sudo modprobe vfio-pci
请注意,为了使用VFIO,您的内核必须支持它。从3.6.0版开始,Linux内核中已包含VFIO内核模块,通常默认情况下会提供VFIO内核模块,但是请查阅您的发行版文档以确保确实如此。
从Linux 5.7版开始的vfio-pci模块支持虚拟功能的创建。将PF绑定到vfio-pci模块后,用户可以通过sysfs接口创建VF,并将这些VF自动绑定到vfio-pci模块。
当PF绑定到vfio-pci时,它具有由随机生成的初始VF令牌。出于安全原因,此令牌是只写的,用户无法直接从内核读取它。要访问VF,用户需要使用令牌参数启动PF,以UUID格式设置VF令牌,然后可以使用此新令牌访问VF。
由于vfio-pci模块使用VF令牌作为内部数据来提供SR-IOV PF和VF之间的协作,因此DPDK可以对绑定到一个应用程序的所有PF设备使用相同的VF令牌。可以通过EAL参数–vfio-vf-token指定此VF令牌。
1. Generate the VF token by uuid command
14d63f20-8445-11ea-8900-1f9ce7d5650d
2. sudo modprobe vfio-pci enable_sriov=1
2. ./usertools/dpdk-devbind.py -b vfio-pci 0000:86:00.0
3. echo 2 > /sys/bus/pci/devices/0000:86:00.0/sriov_numvfs
4. Start the PF:
./x86_64-native-linux-gcc/app/testpmd -l 22-25 -n 4 -w 86:00.0 \
--vfio-vf-token=14d63f20-8445-11ea-8900-1f9ce7d5650d --file-prefix=pf -- -i
5. Start the VF:
./x86_64-native-linux-gcc/app/testpmd -l 26-29 -n 4 -w 86:02.0 \
--vfio-vf-token=14d63f20-8445-11ea-8900-1f9ce7d5650d --file-prefix=vf0 -- -i
另外,要使用VFIO,内核和BIOS都必须支持并配置为使用IO虚拟化(例如Intel®VT-d)。
注意
vfio-pci模块不支持在Linux 5.7之前的版本中创建虚拟功能。
为了在以非特权用户身份运行DPDK应用程序时正确运行VFIO,还应设置正确的许可权。这可以通过使用DPDK安装脚本(位于dpdk-setup.sh,位于usertools目录中)来完成。
注意
可以在没有IOMMU的情况下使用VFIO。尽管这与使用UIO一样不安全,但在IOMMU不可用的情况下,它的确使用户可以保持VFIO拥有的设备访问和编程的程度。
原文链接:http://doc.dpdk.org/guides/linux_gsg/linux_drivers.html