0

我使用的是双端口网卡 Mellanox ConnectX-5,DPDK 版本是 dpdk-stable-19.11.3。配置完成后,调用 rte_eth_dev_count_avail()返回2。但是我的 ConnectX-5 网卡只有一个端口连接到另一台机器。我能找到的就是像这样初始化所有可用的端口。

RTE_ETH_FOREACH_DEV(portid)
    if (port_init(portid, mbuf_pool) != 0)
        rte_exit(EXIT_FAILURE, "Cannot init port %u\n", portid);

dpdk 可以选择性地初始化端口吗?或者有什么办法可以rte_eth_dev_count_avail()退货1

4

2 回答 2

1

通过使用 DPDK 工具dpdk-devbind.py和 EAL 端口初始化将所有可用端口分配给 DPDK 应用程序的特定端口的另一种快速方法将选择分配给 UIO/VFIO 内核驱动程序的端口。以下是用于识别端口当前状态以及如何将所需端口绑定到 DPDK 的 devbind 脚本步骤。

[root@linux usertools]# ./dpdk-devbind.py --status

Network devices using kernel driver
===================================
0000:00:03.0 '82540EM Gigabit Ethernet Controller 100e' if= drv=e1000 unused=vfio-pci
0000:00:04.0 '82540EM Gigabit Ethernet Controller 100e' if= drv=e1000 unused=vfio-pci

[root@linux usertools]# ./dpdk-devbind.py --bind=vfio-pci 00:04.0
[root@linux usertools]# ./dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
0000:00:04.0 '82540EM Gigabit Ethernet Controller 100e' drv=vfio-pci unused=e1000

Network devices using kernel driver
===================================
0000:00:03.0 '82540EM Gigabit Ethernet Controller 100e' if= drv=e1000 unused=vfio-pci

[EDIT-1] 根据作者更新的问题,请求是从连接的可用 DPDK 端口识别的?如上所述,一个需要使用的答案rte_eth_link_get

于 2020-08-28T17:34:28.917 回答
0

是的,可以通过将正确的 PCIeBus:Device:Function地址作为白名单来选择性地初始化端口。因此,应用程序中只会弹出所需的端口。

怎么做:

  1. 创建一个虚拟应用程序来接收所有 DPDK 端口。
  2. 初始化并启动 dpdk 端口。检查链接状态并创建在应用程序逻辑中过滤的端口掩码(全局变量)。
  3. 调用rte_eth_dev_stop & rte_eth_dev_close链路关闭端口。
  4. 调用 rte_eal_cleanup。
  5. 使用端口掩码作为execv调用所需 DPDK 应用程序的参数。

这样您就可以使用有效的端口运行您的应用程序。

但是依赖rte_eth_link_get是棘手的,因为

  • 如果另一端连接到 dpdk-pktgen,首先您的 DPDK 应用程序必须在本地初始化 NIC。
  • 如果连接到 linux box,则必须先购买 nicifconfig [other nic] up
  • 有时需要检查link.link_speed其是否有效。
  • 某些 PMD 需要写入 PCIe 映射寄存器,因此必须使用 dev_configure 和 port_init 才能获得可靠的链接状态读数。

因此,最安全和推荐的使用方式是identify the NIC PCIe B:D:F in Linux driver and then whitelist the ports by using option -w for the desired port under igb_uio/virtio-pci. 这可以通过在 linux 中绑定所有 NIC 来完成

  1. lshw -c network -businfoBus:Device:Function将列出带有内核设备名称和驱动程序的NIC 和 PCIe 。
  2. 用于ethtool [eth device name] | grep Link识别链路是否连接。

作为参考,您可以使用https://github.com/vipinpv85/DPDK-APP_SAMPLES/blob/master/auto-baseaddr-selector.c作为虚拟应用的模板。

于 2020-08-28T17:09:23.400 回答