DPDK端口数必须是偶数

DPDK Number of ports must be even

我花了一些时间试图弄清楚如何修复“端口数必须是偶数”错误。我看过 this answer,它解释了如何在 VM 中 运行 DPDK。我想知道是否有不需要的解决方案。

我的平台:Debian 10,Linux 5.8(在笔记本电脑上),带有 e1000e NIC 驱动程序

我想做的事:使框架 (basicfwd) 应用正常工作

我的问题:rte_eth_dev_count_avail returns 0

到目前为止我做了什么:I followed the documentation 并尝试为我的以太网设备设置 vfio_pci 驱动程序。

两件事:

骨架程序无法使用此功能,因此我尝试使用其他驱动程序。

我将设备绑定到 uio_pci_generic 驱动程序。它确实绑定到它,但该应用程序仍然无法运行。这是 dpdk-devbind.py --status 输出:

Network devices using DPDK-compatible driver
============================================
0000:00:1f.6 'Device 0d4f' drv=uio_pci_generic unused=e1000e

启动程序时发生了什么:

$ sudo ./build/examples/dpdk-skeleton -l 0-3 -n 4 -a 0000:00:1f.6 

EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'VA'
EAL: Probing VFIO support...
EAL: No legacy callbacks, legacy socket not created
EAL: Error - exiting with code: 1
  Cause: Error: number of ports must be even

感谢阅读,如有任何帮助我们将不胜感激!

在 VM 中,我可以通过以下步骤绑定 e1000

  1. 使用 82540EM Gigabit Ethernet Controller
  2. 启动 VM
  3. 下载并构建 DPDK 21.02
  4. insmod igb_uio 或 modprobe uio_pci_generic
  5. 与 vfio-pci 的绑定失败 vfio-pci: probe of 0000:00:08.0 failed with error -22
  6. 使用 ./a.out -l 1 --log-level=pmd,8
  7. 启动应用程序

构建应用程序:gcc basicfwd.c $(pkg-config --libs --cflags --static libdpdk

日志:

e1000_null_phy_generic(): e1000_null_phy_generic
e1000_read_phy_reg_m88(): e1000_read_phy_reg_m88
e1000_null_ops_generic(): e1000_null_ops_generic
e1000_read_phy_reg_mdic(): e1000_read_phy_reg_mdic
e1000_null_phy_generic(): e1000_null_phy_generic
e1000_read_phy_reg_m88(): e1000_read_phy_reg_m88
e1000_null_ops_generic(): e1000_null_ops_generic
e1000_read_phy_reg_mdic(): e1000_read_phy_reg_mdic
e1000_null_phy_generic(): e1000_null_phy_generic
e1000_setup_copper_link_generic(): Unable to establish link!!!
e1000_setup_link_generic(): Initializing the Flow Control address, type and timer regs
e1000_set_fc_watermarks_generic(): e1000_set_fc_watermarks_generic
e1000_clear_hw_cntrs_82540(): e1000_clear_hw_cntrs_82540
e1000_clear_hw_cntrs_base_generic(): e1000_clear_hw_cntrs_base_generic
e1000_check_for_copper_link_generic(): e1000_check_for_copper_link
e1000_phy_has_link_generic(): e1000_phy_has_link_generic
e1000_read_phy_reg_m88(): e1000_read_phy_reg_m88
e1000_null_ops_generic(): e1000_null_ops_generic
e1000_read_phy_reg_mdic(): e1000_read_phy_reg_mdic
e1000_null_phy_generic(): e1000_null_phy_generic
e1000_read_phy_reg_m88(): e1000_read_phy_reg_m88
e1000_null_ops_generic(): e1000_null_ops_generic
e1000_read_phy_reg_mdic(): e1000_read_phy_reg_mdic
e1000_null_phy_generic(): e1000_null_phy_generic
e1000_null_ops_generic(): e1000_null_ops_generic
eth_em_dev_init(): port_id 0 vendorID=0x8086 deviceID=0x100e

注意:未修改的骨架需要偶数个端口才能正常工作。

因此 e1000 和 DPDK 可用性没有问题

[EDIT-1] 与 Jeremy 进行了实时调试,该问题现在在具有物理 NIC(未模拟的 e1000)的物理机器上重现。检查 PCIe 详细信息,物理 NIC 不在支持的列表中 Intel DPDK NIC。请求使用 DPDK 推荐的物理网卡。