Getting Started Guide for Linux(5)Linux驱动程序

官方文档查看地址:
http://doc.dpdk.org/guides/linux_gsg/linux_drivers.html
PDF下载地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-getting-started-guide.html

本篇难度系数:
翻译:☆☆☆☆☆
理解:★★☆☆☆

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

5.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

请注意
对于一些不支持遗留中断的设备,例如virtual function (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命令行中添加intel_iommu=off或intel_iommu=on iommu=ptin GRUB command line on x86_64 systems, or addiommu.passthrough=1在arm64系统上。

由于DPDK release 1.7后续版本提供了VFIO支持,因此对于支持VFIO的平台,UIO的使用是可选的。

5.2VFIO
一个比UIO更健壮和安全的驱动程序,依赖于IOMMU保护。要使用VFIO,必须加载vfio-pci模块:

sudo modprobe vfio-pci

注意,为了使用VFIO,内核必须支持它。VFIO内核模块从3.6.0版开始就包含在Linux内核中,并且通常是默认的,但是请参考您的发行版文档以确保情况确实如此。

此外,要使用VFIO,内核和BIOS都必须支持并配置为使用IO虚拟化(如Intel®VT-d)。

请注意
vfio-pci模块不支持创建虚拟函数

在以非特权用户身份运行DPDK应用程序时,为了正确地操作VFIO,还应该设置正确的权限。这可以通过使用DPDK设置脚本(称为DPDK -setup.sh,位于usertools目录中)来实现。

请注意VFIO可以在没有IOMMU的情况下使用。虽然这与使用UIO一样不安全,但是在IOMMU不可用的情况下,用户可以保留VFIO拥有的设备访问和编程的程度。

5.3. Bifurcated Driver
使用分岔驱动程序的PMDs与设备内核驱动程序共存。在这样的模型中,NIC由内核控制,而数据路径则由设备上的PMD直接执行。

这种模式有以下好处:

  • 它是安全且健壮的,因为内存管理和隔离是由内核完成的。
  • 它允许用户在相同的网络端口上运行DPDK应用程序时使用传统的linux工具,如ethtool或ifconfig。
  • 它允许DPDK应用程序只过滤部分流量,而其余的流量将由内核驱动程序定向和处理。流分岔由NIC硬件完成。例如,使用流隔离模式(http://doc.dpdk.org/guides/prog_guide/rte_flow.html#flow-isolated-mode)可以严格选择DPDK中接收到的内容。

有关分岔驱动程序的更多信息可以在 Mellanox Bifurcated DPDK PMD中找到。

5.4与内核模块之间的网络端口进行绑定和解绑定
请注意使用分岔驱动程序的pmd不应与其内核驱动程序解除绑定。本节针对使用UIO或VFIO驱动程序的PMDs。

从1.4版开始,DPDK应用程序不再自动从正在使用的内核驱动程序解绑定所有支持的网络端口。相反,如果使用的PMD使用UIO或VFIO驱动程序,则DPDK应用程序使用的所有端口必须在运行应用程序之前绑定到uio_pci_generic、igb_uio或vfio-pci模块。对于这样的pmd,应用程序将忽略Linux*控制下的任何网络端口,并且不能使用它们。

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

警告
由于VFIO的工作方式,可以与VFIO一起使用的设备存在一定的限制。这主要取决于IOMMU集团是如何运作的。任何虚拟功能设备都可以单独与VFIO一起使用,但是物理设备将需要绑定到VFIO的所有端口,或者其中一些端口绑定到VFIO,而其他端口则完全不绑定到任何端口。
如果您的设备位于PCI-to-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=uio_pci_generic unused=ixgbe
0000:82:00.1 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe

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

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

将设备eth1 ’ ’ 04:00.1 ’ '绑定到uio_pci_generic驱动程序:

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

,或者

./usertools/dpdk-devbind.py --bind=uio_pci_generic eth1

要将设备82:00.0恢复到其原始内核绑定:

./usertools/dpdk-devbind.py --bind=ixgbe 82:00.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值