DPDK官方文档翻译:Linux Drivers

参考:http://doc.dpdk.org/guides/linux_gsg/linux_drivers.html#linux-gsg-binding-kernel


不同的 PMD 可能需要不同的内核驱动程序才能正常工作。根据所使用的 PMD,应加载相应的内核驱动程序,并且网络端口应绑定到该驱动程序。

1、绑定和取消绑定内核模块的网络端口

注意:使用分叉驱动程序的 PMD 不应与其内核驱动程序解除绑定。本部分适用于使用 UIO 或 VFIO 驱动程序的 PMD。有关更多详细信息,请参阅分叉驱动程序部分。

注意:建议在所有情况下将 vfio-pci 用作 DPDK 绑定端口的内核模块。如果 IOMMU 不可用,则可以在无 IOMMU 模式下使用 vfio-pci。如果由于某种原因,vfio 不可用,则可以使用基于 UIO 的模块、igb_uio和uio_pci_generic。有关详细信息,请参阅 UIO 部分。

大多数设备要求 DPDK 使用的硬件与其使用的内核驱动程序解除绑定,而是在应用程序运行之绑定到 vfio-pci 内核模块。对于此类 PMD,Linux 控制下的任何网络端口或其他硬件都将被忽略,并且应用程序无法使用*。

要将端口绑定到 vfio-pci 模块以供 DPDK 使用,或将端口返回到 Linux 控件,在 usertools 子目录中提供了一个名为 dpdk-devbind.py实用程序脚本。此实用程序可用于提供系统上网络端口当前状态的视图,以及从不同的内核模块(包括 VFIO 和 UIO 模块)绑定取消绑定这些端口。下面是如何使用该脚本的一些示例。脚本及其参数的完整描述可以通过使用 --help 或 --usage 选项调用脚本来获取。请注意,在运行 dpdk-devbind.py 脚本之前,应将要使用的 UIO 或 VFIO 内核模块加载到内核中

注意:由于 VFIO 的工作方式,哪些设备可以与 VFIO 一起使用存在一定的限制。主要归结为IOMMU小组的工作方式。任何虚拟功能设备通常都可以单独与 VFIO 一起使用,但物理设备可能需要绑定到 VFIO 的所有端口,或者其中一些端口绑定到 VFIO,而其他端口根本不绑定到任何东西。

注意:如果您的设备位于 PCI 到 PCI 网桥后面,则该网桥将成为设备所在的 IOMMU 组的一部分。因此,桥接驱动程序还应与网桥 PCI 设备解除绑定,以便 VFIO 与网桥后面的设备配合使用。

注意:虽然任何用户都可以运行 dpdk-devbind.py 脚本来查看网络端口的状态,但绑定取消绑定网络端口需要 root 权限

要查看系统上所有网络端口的状态:

./usertools/dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
0000:82:00.0 '82599EB 10-GbE NIC' drv=vfio-pci unused=ixgbe
0000:82:00.1 '82599EB 10-GbE NIC' drv=vfio-pci unused=ixgbe

Network devices using kernel driver
===================================
0000:04:00.0 'I350 1-GbE NIC' if=em0  drv=igb unused=vfio-pci *Active*
0000:04:00.1 'I350 1-GbE NIC' if=eth1 drv=igb unused=vfio-pci
0000:04:00.2 'I350 1-GbE NIC' if=eth2 drv=igb unused=vfio-pci
0000:04:00.3 'I350 1-GbE NIC' if=eth3 drv=igb unused=vfio-pci

Other network devices
=====================
<none>

要将设备 eth1,‘‘04:00.1’’ 绑定到 vfio-pci 驱动程序:

./usertools/dpdk-devbind.py --bind=vfio-pci 04:00.1

或者:

./usertools/dpdk-devbind.py --bind=vfio-pci eth1

指定设备 ID 时,通配符可用于地址的最后一部分。要将设备 82:00.0 和 82:00.1 恢复到其原始内核绑定,请执行以下操作:

./usertools/dpdk-devbind.py --bind=ixgbe 82:00.*

2、VFIO

VFIO 是一个强大而安全的驱动程序,依赖于 IOMMU 保护。要使用 VFIO,必须加载 vfio-pci 模块:

sudo modprobe vfio-pci

默认情况下,VFIO 内核通常存在于所有发行版中,但是请查阅您的发行版文档以确保情况如此。

要使用完整的 VFIO 功能,内核和 BIOS 都必须支持并配置为使用 IO 虚拟化(如英特尔® VT-d)。

注意:在大多数情况下,指定“iommu=on”作为内核参数应该足以将Linux内核配置为使用IOMMU。

为了在以非特权用户身份运行 DPDK 应用程序时正确操作 VFIO,还应设置正确的权限。有关详细信息,请参阅在没有 root 权限的情况下运行 DPDK 应用程序:http://doc.dpdk.org/guides/linux_gsg/enable_func.html#running-without-root-privileges

1、VFIO 无 IOMMU 模式

如果系统上没有可用的 IOMMU,仍然可以使用 VFIO,但必须使用附加模块参数加载它:

modprobe vfio enable_unsafe_noiommu_mode=1

或者,也可以在已经加载的内核模块中启用此选项:

echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

之后,VFIO 可以像往常一样与硬件设备一起使用。

注意:在使用 enable_unsafe_noiommu_mode=1 参数再次探测模块之前,可能需要卸载所有与 VFIO 相关的模块。

警告:由于无 IOMMU 模式放弃了 IOMMU 保护,因此它本质上是不安全的。也就是说,在IOMMU不可用的情况下,它确实使用户可以保持VFIO具有的设备访问和编程程度。

2、VFIO 内存映射限制

对于外部存储器或大页的DMA映射,使用VFIO接口。VFIO 不支持对曾经映射的内存进行部分取消映射。因此,DPDK 的内存以巨大的页面粒度或系统页面粒度映射。DMA 映射的数量受内核的限制,具有用户锁定的进程内存限制 (rlimit) 用于系统/大页面内存。在内核 5.1 中添加了另一个适用于外部内存和系统内存的每个容器的总限制,该限制由 VFIO 模块参数 dma_entry_limit 定义,默认值为 64K。当应用程序超出 DMA 条目时,需要调整这些限制以增加允许的限制。

3、使用 vfio-pci 创建虚拟功能

从 Linux 5.7 版本开始,vfio-pci 模块支持创建虚拟功能。PF绑定到vfio-pci模块后,用户可以使用sysfs接口创建VF,这些VF将自动绑定到vfio-pci模块。

当 PF 绑定到 vfio-pci 时,默认情况下它将具有随机生成的 VF 令牌。出于安全原因,此令牌仅写入,因此用户无法直接从内核读取它。若要访问 VF,用户需要创建一个新令牌,并使用它来初始化 VF 和 PF 设备。令牌采用 UUID 格式,因此任何 UUID 生成工具都可用于创建新令牌。

此 VF 令牌可以使用 EAL 参数 --vfio-vf-token 传递给 DPDK。令牌将用于应用程序中的所有 PF 和 VF 端口。

1、通过 uuid 命令生成 VF 令牌

14d63f20-8445-11ea-8900-1f9ce7d5650d

2、加载具有enable_sriov参数集的 vfio-pci 模块

sudo modprobe vfio-pci enable_sriov=1

或者,如果模块已加载或内置,则通过 sysfs 传递 enable_sriov 参数:

echo 1 | sudo tee /sys/module/vfio_pci/parameters/enable_sriov

3、将 PCI 设备绑定到 vfio-pci 驱动程序

./usertools/dpdk-devbind.py -b vfio-pci 0000:86:00.0

4、创建所需数量的 VF 设备

echo 2 > /sys/bus/pci/devices/0000:86:00.0/sriov_numvfs

5、启动将管理 PF 设备的 DPDK 应用程序

<build_dir>/app/dpdk-testpmd -l 22-25 -n 4 -a 86:00.0 \
--vfio-vf-token=14d63f20-8445-11ea-8900-1f9ce7d5650d --file-prefix=pf -- -i

6、启动将管理 VF 设备的 DPDK 应用程序

<build_dir>/app/dpdk-testpmd -l 26-29 -n 4 -a 86:02.0 \
--vfio-vf-token=14d63f20-8445-11ea-8900-1f9ce7d5650d --file-prefix=vf0 -- -i

注意:低于版本 5.7 的 Linux 版本不支持在 VFIO 框架内创建虚拟功能。

4、VFIO 疑难解答

在某些情况下,使用 dpdk-devbind.py 脚本将设备绑定到 VFIO 驱动程序可能会失败。首先要检查的是内核消息:

dmesg | tail
...
[ 1297.875090] vfio-pci: probe of 0000:31:00.0 failed with error -22
...

在大多数情况下,错误 -22 表示无法启用 VFIO 子系统,因为没有 IOMMU 支持。

要检查内核是否已使用正确的参数引导,可以检查内核命令行:

cat /proc/cmdline

有关如何为系统正确配置内核参数的信息,请参阅前面的部分。

如果内核配置正确,还必须确保 BIOS 配置具有虚拟化功能(例如英特尔® VT-d)。没有标准方法可以检查平台是否配置正确,因此请查看您的平台文档以查看它是否具有此类功能以及如何启用它们。

在某些发行版中,默认内核配置使得在编译时完全禁用无 IOMMU 模式。这可以在系统的引导配置中进行检查:

cat /boot/config-$(uname -r) | grep NOIOMMU
# CONFIG_VFIO_NOIOMMU is not set

如果未在内核配置中启用CONFIG_VFIO_NOIOMMU,VFIO 驱动程序将不支持无 IOMMU 模式,并且必须使用其他替代方法(例如 UIO 驱动程序)。

3、VFIO平台

VFIO 平台是一个内核驱动程序,它通过添加对驻留在 IOMMU 后面的平台设备的支持来扩展 VFIO 的功能。Linux 通常在启动阶段直接从设备树中了解平台设备,这与内置必要信息的 PCI 设备不同。

要使用 VFIO 平台,必须先加载 vfio 平台模块:

sudo modprobe vfio-platform

注意:默认情况下,vfio 平台假定平台设备具有专用的重置驱动程序。如果缺少此类驱动程序或设备不需要驱动程序,则可以通过设置 reset_required=0 模块参数来关闭此选项。

之后平台设备需要绑定到vfio平台。这是需要两个步骤的标准程序。第一个driver_override,在平台设备目录中可用,需要设置为 vfio-platform:

sudo echo vfio-platform > /sys/bus/platform/devices/DEV/driver_override

下一个 DEV 设备必须绑定到 vfio 平台驱动程序:

sudo echo DEV > /sys/bus/platform/drivers/vfio-platform/bind

在应用程序启动时,DPDK 平台总线驱动程序扫描 /sys/bus/platform/devices,搜索具有指向 vfio 平台驱动程序的驱动程序符号链接的设备。最后,扫描的设备与可用的 PMD 进行匹配。如果 PMD 名称或 PMD 别名与内核驱动程序名称匹配,或者 PMD 名称与平台设备名称匹配,则匹配成功。

VFIO 平台依赖于 ARM/ARM64,通常在这些系统上运行的发行版上启用。请查阅您的发行版文档以确保情况确实如此。

4、Bifurcated 驱动

使用 Bifurcated 驱动程序的 PMD 与设备内核驱动程序共存。在这种型号上,NIC由内核控制,而数据路径由PMD直接在设备顶部执行。

这种模型具有以下优点:
1、它是安全而健壮的,因为内存管理和隔离是由内核完成的。
2、它使用户能够使用传统的Linux工具,如ethtool或ifconfig,同时在同一网络端口上运行DPDK应用程序。
3、它使 DPDK 应用程序能够仅过滤部分流量,而其余流量将由内核驱动程序定向和处理。流分叉由 NIC 硬件执行。例如,使用流隔离模式允许严格选择DPDK中接收的内容。

有关分叉驱动程序的更多信息,请参阅 NVIDIA 分叉 PMD 演示文稿:https://www.dpdk.org/wp-content/uploads/sites/35/2016/10/Day02-Session04-RonyEfraim-Userspace2016.pdf。

5、UIO

警告:由于此方法缺乏 IOMMU 保护,因此使用 UIO 驱动程序本质上是不安全的,只能由 root 用户完成。

在无法使用 VFIO 的情况下,可以使用替代驱动程序。在许多情况下,Linux 内核中包含的标准uio_pci_generic模块可以用作 VFIO 的替代品。可以使用以下命令加载此模块:

sudo modprobe uio_pci_generic

注意:uio_pci_generic模块不支持创建虚拟功能。

作为uio_pci_generic的替代方案,可以在存储库dpdk-kmods中找到igb_uio模块。它可以按如下所示加载:

sudo modprobe uio
sudo insmod igb_uio.ko

注意:对于某些不支持传统中断的设备,例如虚拟功能(VF)设备,可能需要igb_uio模块来代替uio_pci_generic。

注意:如果启用了 UEFI 安全引导,Linux 内核可能会禁止在系统上使用 UIO。因此,DPDK 使用的设备应绑定到 vfio-pci 内核模块,而不是任何基于 UIO 的模块。有关更多详细信息,请参阅下面的绑定和取消绑定到内核模块的网络端口。

注意:如果用于 DPDK 的设备绑定到基于 UIO 的内核模块,请确保 IOMMU 已禁用或处于直通模式。可以在x86_64系统上的 GRUB 命令行中添加 intel_iommu=off 或 amd_iommu=off 或 intel_iommu=on iommu=pt,或者在 aarch64 系统上添加 iommu.passthrough=1。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值