CX4网卡配置问题导致DPDK无法运行
发表于 2025/10/21
0
1、环境信息
硬件信息
环境 |
基准环境 |
对比环境 |
服务器型号 |
TaiShan 200 2280 |
TaiShan 200 2280 |
CPU型号 |
Kunpeng 920 |
Kunpeng 920-5250 |
内存 |
NA |
12*32G 2933MHz |
网卡型号 |
1*CX4网卡 |
2*CX4网卡 |
操作系统及软件信息
基准环境和对比环境的软件配置相同。
操作系统版本 |
openEuler 20.03 LTS-SP1 |
内核版本 |
4.19.90-2109.1.0.0108.oe1.aarch64 |
编译器版本 |
GCC-7.3.0 |
DPDK版本 |
DPDK-18.11.11 |
网卡驱动版本 |
升级前5.0-0,升级后5.4-3.6.8 |
网卡固件版本 |
14.28.1300 |
2、组网方式
版本测试都有两台设备对接,其中一端启动testpmd环回,另一端使用pktgen发包测试。

3、环境部署
DPDK测试需要依赖一些库文件和相关命令,可使用如下方法进行安装:
可使用系统镜像ISO配置本地源,也可以通过网络或VPN配置官方yum源。
-
上传操作系统镜像ISO到/home下。
优先选用everything版本镜像,包含软件包相对较多。
-
挂载镜像。
mkdir /home/localrepo
mount /home/ openEuler-20.03-LTS-SP1-everything-aarch64-dvd.iso /home/localrepo
-
配置yum.repo文件。
mv /etc/yum.repos.d /etc/yum.repos.d-bak
mkdir /etc/yum.repos.d
vim /etc/yum.repos.d/local.repo
写入如下配置并保存退出。
[localrepo]
name=localrepo
baseurl=file:///home/localrepo
gpgcheck=0
enabled=1
-
刷新yum源缓存。
yum clean && yum makecache
-
安装依赖库。
yum install -y gcc gcc-c++ rdma-core rdma-core-devel libnl3-devel numactl numactl-devel libpcap-devel readline-devel libnml-devel
4、编译DPDK
官方下载页面:http://core.dpdk.org/download/
下载源码。
从官网下载DPDK-18.11.11源码。
wget http://fast.dpdk.org/rel/dpdk-18.11.11.tar.xz
解压并进入源码目录。
tar -xf dpdk-18.11.11.tar.x
cd dpdk-stable-18.11.11/config/ && ls
修改common_base文件。
开启IGB_UIO、VFIO驱动选项和CX4网卡驱动选项(修改为y),保存配置文件。
vim common_base

进入usertools文件夹,运行dpdk-setup.sh脚本。
cd ../usertools
./ dpdk-setup.sh
Kunpeng920处理器是arm64-armv8a芯片架构,采用gcc编译器安装。输入选项“2”,然后开始编译。

等待编译完成。

使能IGB_UIO、VFIO驱动,输入选项“18”“19”。

最后输入“35”退出。
查看网卡信息。
./dpdk-devbind.py -s
5、问题分析
5.1问题现象及复现
DPDK测试需要依赖一些库文件和相关命令,可使用如下方法进行安装:
可使用系统镜像ISO配置本地源,也可以通过网络或VPN配置官方yum源。
-
上传操作系统镜像ISO到/home下。
优先选用everything版本镜像,包含软件包相对较多。
-
挂载镜像。
mkdir /home/localrepo
mount /home/ openEuler-20.03-LTS-SP1-everything-aarch64-dvd.iso /home/localrepo
-
配置yum.repo文件。
mv /etc/yum.repos.d /etc/yum.repos.d-bak
mkdir /etc/yum.repos.d
vim /etc/yum.repos.d/local.repo
写入如下配置并保存退出。
[localrepo]
name=localrepo
baseurl=file:///home/localrepo
gpgcheck=0
enabled=1
-
刷新yum源缓存。
yum clean && yum makecache
-
安装依赖库。
yum install -y gcc gcc-c++ rdma-core rdma-core-devel libnl3-devel numactl numactl-devel libpcap-devel readline-devel libnml-devel
下载源码。
从官网下载DPDK-18.11.11源码。
wget http://fast.dpdk.org/rel/dpdk-18.11.11.tar.xz
解压并进入源码目录。
tar -xf dpdk-18.11.11.tar.x
cd dpdk-stable-18.11.11/config/ && ls

开启IGB_UIO、VFIO驱动选项和CX4网卡驱动选项(修改为y),保存配置文件。

cd ../usertools
./ dpdk-setup.sh




查看网卡信息。
./dpdk-devbind.py -s

问题现象
编译安装DPDK后,用DPDK自带的helloworld示例程序测试,用于验证DPDK环境是否正常。
测试过程报错截图:

网卡驱动状态截图:

编译安装DPDK后,用DPDK自带的helloworld示例程序测试,用于验证DPDK环境是否正常。
测试过程报错截图:
网卡驱动状态截图:
复现条件
在1-环境信息的环境下,并准备好3-环境部署后,执行helloworld示例程序测试,问题可以复现。
在1-环境信息的环境下,并准备好3-环境部署后,执行helloworld示例程序测试,问题可以复现。
复现过程
-
编译生成DPDK自带的helloworld示例程序并运行。
-
指定用户态驱动igb_uio并绑定bus号为0000:01:00.1的网卡。
-
执行helloworld示例程序测试,指定用户态驱动的网口出现问题,其余网口正常。
-
用DPDK自带test-pmd测试程序验证,指定用户态驱动的网口出现问题,其余网口正常。

5.2具体分析
从helloworld测试报错打印可以看出,net_mlx5需要用到的bus号0000:01:00.0被占用。应该是用户态驱动igb_uio并绑定网口时占用了。原因见下图:
绑定网口前:

绑定网口后:

如果是这样的话,用网口创建VF,创建VF的同时会生成新的bus号,把VF绑定到用户态驱动igb_uio,就不会和网口内核态驱动有bus号冲突。
-
编译生成DPDK自带的helloworld示例程序并运行。
-
指定用户态驱动igb_uio并绑定bus号为0000:01:00.1的网卡。
-
执行helloworld示例程序测试,指定用户态驱动的网口出现问题,其余网口正常。
-
用DPDK自带test-pmd测试程序验证,指定用户态驱动的网口出现问题,其余网口正常。
5.2具体分析
从helloworld测试报错打印可以看出,net_mlx5需要用到的bus号0000:01:00.0被占用。应该是用户态驱动igb_uio并绑定网口时占用了。原因见下图:
绑定网口前:
绑定网口后:
如果是这样的话,用网口创建VF,创建VF的同时会生成新的bus号,把VF绑定到用户态驱动igb_uio,就不会和网口内核态驱动有bus号冲突。
-
创建VF。
echo 1 > /sys/class/net/enp1s0f1/device/sriov_numvfs 
-
dpdk命令查看生成的VF。
./dpdk-devbind.py -s
-
指定用户态驱动igb_uio并绑定bus号为0000:01:2的VF。
-
执行helloworld示例程序测试。
-
切换为vfio驱动。

运行失败,说明存在其他地方被限制。
5.3验证驱动版本兼容问题
IGB_UIO、VFIO驱动都是虚拟化强相关特性,使能硬件和操作系统虚拟化参数选项,高版本的网卡驱动兼容性更高,也一并升级下。
-
创建VF。
echo 1 > /sys/class/net/enp1s0f1/device/sriov_numvfs
-
dpdk命令查看生成的VF。
./dpdk-devbind.py -s
-
指定用户态驱动igb_uio并绑定bus号为0000:01:2的VF。
-
执行helloworld示例程序测试。
-
切换为vfio驱动。
运行失败,说明存在其他地方被限制。
5.3验证驱动版本兼容问题
IGB_UIO、VFIO驱动都是虚拟化强相关特性,使能硬件和操作系统虚拟化参数选项,高版本的网卡驱动兼容性更高,也一并升级下。
升级网卡驱动
./mlnxofedinstall --dpdk




./mlnxofedinstall --dpdk
修改系统内核启动参数
-
添加grub选项。
在grub文件中添加:
iommu.passthrough=1 pci=pcie_bus_perf pciehp.pciehp_force=1
-
重启后进BIOS确认smmu为enabled(硬件虚拟化开关)。
-
重启后网卡驱动升级成功。
-
添加grub选项。
在grub文件中添加:
iommu.passthrough=1 pci=pcie_bus_perf pciehp.pciehp_force=1
-
重启后进BIOS确认smmu为enabled(硬件虚拟化开关)。
-
重启后网卡驱动升级成功。
验证切IGB_UIO和VFIO驱动是否正常
升级网卡驱动重启后,需要重新加载IGB_UIO、VFIO驱动。

-
重新加载IGB_UIO驱动。
存在报错信息。
-
加载vfio驱动。
-
切vfio驱动,查看dpdk是否接管正常。
-
挂载大页内存。
-
执行helloworld。
-
重新编译dpdk后执行helloworld。
-
结论。
不是驱动版本问题。
5.4验证DPDK程序自动切换功能
默认使用mlx5_core的网卡,无论是helloworld还是test-pmd测试都正常。推断CX4网卡已经不需要切驱动,可用DPDK程序直接接管(自动切换)。
不手动切换驱动,物理网口和VF用helloworld测试正常。


不手动切换驱动,物理网口和VF用test-pmd测试正常


DPDK官方文档说明:
https://doc.dpdk.org/guides/nics/mlx5.html

结合网络相关资料分析:
不使用igb_uio.ko。
https://github.com/xiangp126/dpdk/blob/master/mellanox/Mellanox.md

启动DPDK之前,不需要为Mellanox绑定igb_uio或者uio_pci_generic等用户态驱动(https://zhuanlan.zhihu.com/p/484252751)。
网卡使用mlx5_core驱动之后就不再依赖内核的UIO框架,Mellanox会使用它特有的mlx5_core驱动来完成Mellanox 网卡(PCI 设备)的注册。
https://tool.4xseo.com/a/2118.html
6 定位结论
CX4网卡使用mlx5_core驱动来完成Mellanox 网卡(PCI 设备)的注册,和华为或因特尔网卡需要切igb_uio或vfio-pci驱动有差异。现场把网卡绑定到用户态驱动igb_uio,导致igb_uio分配的bus号和mlx5_core驱动的bus号冲突,引发问题。内部环境验证,CX4网卡不切驱动情况下,可由DPDK程序直接接管物理网口或VF。
DPDK官方文档说明:
https://doc.dpdk.org/guides/nics/mlx5.html
升级网卡驱动重启后,需要重新加载IGB_UIO、VFIO驱动。
-
重新加载IGB_UIO驱动。
存在报错信息。
-
加载vfio驱动。
-
切vfio驱动,查看dpdk是否接管正常。
-
挂载大页内存。
-
执行helloworld。
-
重新编译dpdk后执行helloworld。
-
结论。
不是驱动版本问题。
5.4验证DPDK程序自动切换功能
默认使用mlx5_core的网卡,无论是helloworld还是test-pmd测试都正常。推断CX4网卡已经不需要切驱动,可用DPDK程序直接接管(自动切换)。
不手动切换驱动,物理网口和VF用helloworld测试正常。
不手动切换驱动,物理网口和VF用test-pmd测试正常
DPDK官方文档说明:
https://doc.dpdk.org/guides/nics/mlx5.html
结合网络相关资料分析:
不使用igb_uio.ko。
https://github.com/xiangp126/dpdk/blob/master/mellanox/Mellanox.md
启动DPDK之前,不需要为Mellanox绑定igb_uio或者uio_pci_generic等用户态驱动(https://zhuanlan.zhihu.com/p/484252751)。
网卡使用mlx5_core驱动之后就不再依赖内核的UIO框架,Mellanox会使用它特有的mlx5_core驱动来完成Mellanox 网卡(PCI 设备)的注册。
https://tool.4xseo.com/a/2118.html
6 定位结论
CX4网卡使用mlx5_core驱动来完成Mellanox 网卡(PCI 设备)的注册,和华为或因特尔网卡需要切igb_uio或vfio-pci驱动有差异。现场把网卡绑定到用户态驱动igb_uio,导致igb_uio分配的bus号和mlx5_core驱动的bus号冲突,引发问题。内部环境验证,CX4网卡不切驱动情况下,可由DPDK程序直接接管物理网口或VF。
DPDK官方文档说明:
