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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章