DPDK能否有选择地初始化NIC端口
Can DPDK selectively init NIC ports
我使用的是双口网卡,Mellanox ConnectX-5,DPDK版本是dpdk-stable-19.11.3。配置完成后,rte_eth_dev_count_avail()
returns2
的调用。但是我的 ConnectX-5 NIC 只有一个端口连接到另一台机器。我能找到的就是像这样初始化所有可用端口。
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
?
是的,可以通过将正确的 PCIe Bus:Device:Function
地址作为白名单传递来选择性地初始化端口。因此只有需要的端口才会在应用程序中弹出。
怎么做:
- 创建一个虚拟应用程序以接收所有 DPDK 端口。
- 初始化并启动 dpdk 端口。检查 link-state 并创建在应用程序逻辑中过滤的 port-mask(全局变量)。
- 为 link 个关闭端口调用
rte_eth_dev_stop & rte_eth_dev_close
。
- 调用rte_eal_cleanup.
- 使用 port-mask 作为
execv
的参数来调用所需的 DPDK 应用程序。
通过这种方式,您可以 运行 您的应用程序具有有效的端口。
但是依靠 rte_eth_link_get
是棘手的,因为
- 如果另一端连接到 dpdk-pktgen,首先您的 DPDK 应用程序必须在本地初始化 NIC。
- 如果连接到linux盒子,网卡必须先用
ifconfig [other nic] up
购买
- 有时需要检查
link.link_speed
是否有效。
- 某些 PMD 需要写入 PCIe 映射寄存器,因此必须 dev_configure 和 port_init 才能可靠地读取 link 状态。
因此最安全和推荐的使用方式是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 来完成
lshw -c network -businfo
将列出 NIC 和 PCIe Bus:Device:Function
以及 kerel 设备名称和驱动程序。
- 使用
ethtool [eth device name] | grep Link
识别link已连接。
作为参考,您可以使用https://github.com/vipinpv85/DPDK-APP_SAMPLES/blob/master/auto-baseaddr-selector.c作为虚拟应用程序的模板。
通过使用 DPDK 工具 dpdk-devbind.py 将所有可用端口中的特定端口分配给 DPDK 应用程序的另一种快速方法,EAL 端口初始化将选择分配给 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
我使用的是双口网卡,Mellanox ConnectX-5,DPDK版本是dpdk-stable-19.11.3。配置完成后,rte_eth_dev_count_avail()
returns2
的调用。但是我的 ConnectX-5 NIC 只有一个端口连接到另一台机器。我能找到的就是像这样初始化所有可用端口。
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
?
是的,可以通过将正确的 PCIe Bus:Device:Function
地址作为白名单传递来选择性地初始化端口。因此只有需要的端口才会在应用程序中弹出。
怎么做:
- 创建一个虚拟应用程序以接收所有 DPDK 端口。
- 初始化并启动 dpdk 端口。检查 link-state 并创建在应用程序逻辑中过滤的 port-mask(全局变量)。
- 为 link 个关闭端口调用
rte_eth_dev_stop & rte_eth_dev_close
。 - 调用rte_eal_cleanup.
- 使用 port-mask 作为
execv
的参数来调用所需的 DPDK 应用程序。
通过这种方式,您可以 运行 您的应用程序具有有效的端口。
但是依靠 rte_eth_link_get
是棘手的,因为
- 如果另一端连接到 dpdk-pktgen,首先您的 DPDK 应用程序必须在本地初始化 NIC。
- 如果连接到linux盒子,网卡必须先用
ifconfig [other nic] up
购买
- 有时需要检查
link.link_speed
是否有效。 - 某些 PMD 需要写入 PCIe 映射寄存器,因此必须 dev_configure 和 port_init 才能可靠地读取 link 状态。
因此最安全和推荐的使用方式是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
。这可以通过
lshw -c network -businfo
将列出 NIC 和 PCIeBus:Device:Function
以及 kerel 设备名称和驱动程序。- 使用
ethtool [eth device name] | grep Link
识别link已连接。
作为参考,您可以使用https://github.com/vipinpv85/DPDK-APP_SAMPLES/blob/master/auto-baseaddr-selector.c作为虚拟应用程序的模板。
通过使用 DPDK 工具 dpdk-devbind.py 将所有可用端口中的特定端口分配给 DPDK 应用程序的另一种快速方法,EAL 端口初始化将选择分配给 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