还是记录一个小点,希望对大家有所帮助。
背景: 最近需要用 DPDK
测试 Mellanox
的 ConnectX-4 Lx
网卡。在 DPDK
中,该网卡对应的驱动是 mlx5
。使用的 DPDK
版本是 20.11
和 22.03
,结果都出现了类似的报错信息。
问题: 在 testpmd
中启动上述网卡出现报错情况,testpmd
的命令如下:
$ ./build/app/dpdk-testpmd -l 0-3 -a 0000:06:00.0 -a 0000:06:00.1 -- -i
主要的报错信息如下:
...
Configuring Port 1 (socket 0)
mlx5_pci: Failed to init cache list NIC_ingress_0_matcher_cache entry (nil).
mlx5_pci: port 0 failed to set defaults flows
Fail to start port 1
Please stop the ports first
Done
...
在网上搜索一番发现,上述报错信息之前已经有人在 DPDK
的 Bugzilla
上贴过,但后来不了了之了,链接如下:
https://bugs.dpdk.org/show_bug.cgi?id=580
解决方案:
其实,在 DPDK 的官方文档中已经有 mlx5 驱动的使用教程了,链接如下:
https://doc.dpdk.org/guides/platform/mlx5.html
建议先认真看一遍。
核心 的一点就是: 想要顺利使用 DPDK mlx5
驱动,需要成功安装它所依赖的外部组件,包括外部动态库和内核模块,如下所示:
libibverbs
、libmlx5
mlx5_core
、mlx5_ib
、ib_uverbs
毫无疑问,在安装上述组件的过程中或多或少会遇到一些问题,不然也不值得写这篇博客了。
官网文档说,上述组件可以通过三种方式安装。这三种方式我都花了不少的时间尝试过,结论是直接推荐第二种,因为其他两种方式安装成功后,还是有问题,可能是组件之间的版本不匹配。总之这个驱动很复杂,GDB
调试也只能定位到外部组件的问题,但为什么产生那个问题却不知道,还是得踏踏实实的把环境配好。
rdma-core
包 + 使用内核自带模块Mellanox OFED
安装Mellanox EN
安装使用 Mellanox OFED
安装需要下载一个软件包,链接如下:
https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/
下载时需要选择自己所用 OS
和 CPU
架构对应的版本,如果没有,则下载一个最为相近的版本(这个问题被我遇到了)。
如果版本完全匹配,按照官网文档所说,只需要执行下面这个命令就可以安装成功了:
$ ./mlnxofedinstall --dpdk
由于我下载的 Debian
版本和所用 OS
的 Debian
版本不匹配,因此需要将 distro
文件的内容修改为 skip-distro-check
,即如下所示:
$ mv distro distro.bak
$ echo "skip-distro-check" > distro
$ cat distro
skip-distro-check
继续安装时,又提示我内核版本不匹配,因此还需要在命令行加一个参数:--add-kernel-support
,最后的安装命令是:
$ ./mlnxofedinstall --add-kernel-support --dpdk
上述命令需要运行十几分钟,如果中间没有报错就安装成功了。有报错的话,按照提示进行修改和配置,比如修改配置文件、修改安装脚本、增加命令行参数、卸载某些有冲突的软件包等等。总之,一定要安装成功才行。
上边的脚本执行成功后,可通过如下步骤确认相关依赖包是否都安装成功:
libibverbs
包是否安装$ pkg-config --modversion libibverbs
1.14.40.0 // 版本可能会有所差异
libmlx5
包是否安装libmlx5
$ pkg-config --modversion libmlx5
1.24.40.0 // 版本可能会有所差异
mlx5_core
,mlx5_ib
,ib_uverbs
内核模块是否加载$ lsmod |egrep "^mlx5_core|^mlx5_ib|^ib_uverbs"
mlx5_ib 3211264 0
ib_uverbs 1097728 1 mlx5_ib
mlx5_core 10534912 1 mlx5_ib
ib_devinfo
查看是否有设备信息$ ibv_devinfo
hca_id: mlx5_0
transport: InfiniBand (0)
fw_ver: 14.32.1010
node_guid: 0000:0000:0000:0000
sys_image_guid: 0000:0000:0000:0000
vendor_id: 0x02c9
vendor_part_id: 4117
hw_ver: 0x0
board_id: MT_0000000266
phys_port_cnt: 1
port: 1
state: PORT_DOWN (1)
max_mtu: 4096 (5)
active_mtu: 1024 (3)
sm_lid: 0
port_lid: 0
port_lmc: 0x00
link_layer: Ethernet
hca_id: mlx5_1
transport: InfiniBand (0)
fw_ver: 14.32.1010
node_guid: 0000:0000:0000:0001
sys_image_guid: 0000:0000:0000:0000
vendor_id: 0x02c9
vendor_part_id: 4117
hw_ver: 0x0
board_id: MT_0000000266
phys_port_cnt: 1
port: 1
state: PORT_DOWN (1)
max_mtu: 4096 (5)
active_mtu: 1024 (3)
sm_lid: 0
port_lid: 0
port_lmc: 0x00
link_layer: Ethernet
如果 Mellanox OFED
安装失败,或是想自己编译安装,则可以下载 OFED
源码包。OFED-5.7
有 31
个源码包,若只考虑让 DPDK
能够正常运行,则可以只需要编译安装以下源码包:
rdma-core
mlnx-tools
mlnx-ofa_kernel
knem
kernel-mft
mstflint