【问题标题】:DPDK Number of ports must be evenDPDK 端口数必须是偶数
【发布时间】:2021-04-29 08:30:35
【问题描述】:

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

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

我想做的事:让骨架(basicfwd)应用工作

我的问题:rte_eth_dev_count_avail 返回 0

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

两件事:

  • 当我使用 vfio_pci 驱动程序绑定设备时,它会丢失其 IP 界面

  • 我无法创建 VF 设备,因为我无法在 /sys/bus/pci/devices/ 中写入,即使我 su root

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

我将设备绑定到 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

感谢阅读,感谢任何帮助!

【问题讨论】:

  • DPDk Skeleton 需要偶数端口,最少 2 个端口 doc.dpdk.org/dts/test_plans/skeleton_test_plan.html。可以在 Kernel PF 下创建 2 个 VF 并将 VF 绑定到 igb_uio 或 vfio_pci
  • 感谢@VipinVarghese 的回答。我了解该应用程序需要偶数个端口才能工作。问题是 DPDK 没有拾取设备并且无法打开任何端口。正如我所提到的,rte_eth_dev_count_avail 返回 0。你知道为什么 DPDK 没有拿起设备吗?
  • 2 个可能的原因 1) 应用程序在共享库中编译或 2) PMD 未构建。如果需要,我可以让自己在 Skype 上进行快速调试吗?
  • 是的,当然,我没有Skype,我可以给你发一个fidji链接吗?
  • 程序确实是用共享库编译的。您能告诉我更多关于如何构建 PMD 的信息吗?您是说将设备绑定到兼容 dpdk 的驱动程序吗?

标签: dpdk


【解决方案1】:

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

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

构建应用程序: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 推荐的物理网卡。

【讨论】:

    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2014-03-05
    • 2020-07-26
    • 2017-04-08
    相关资源
    最近更新 更多