鲲鹏社区首页
中文
注册
开发者
CX4网卡配置问题导致DPDK无法运行

CX4网卡配置问题导致DPDK无法运行

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网卡

操作系统及软件信息

基准环境和对比环境的软件配置相同。

表1 软件信息对比

操作系统版本

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

组网方式

版本测试都有两台设备对接,其中一端启动testpmd环回,另一端使用pktgen发包测试。

图1 组网方式

环境部署

DPDK测试需要依赖一些库文件和相关命令,可使用如下方法进行安装:

可使用系统镜像ISO配置本地源,也可以通过网络或VPN配置官方yum源。

  1. 上传操作系统镜像ISO到/home下。

    优先选用everything版本镜像,包含软件包相对较多。

  2. 挂载镜像。

    mkdir /home/localrepo

    mount /home/ openEuler-20.03-LTS-SP1-everything-aarch64-dvd.iso /home/localrepo

  3. 配置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

  4. 刷新yum源缓存。

    yum clean && yum makecache

  5. 安装依赖库。

    yum install -y gcc gcc-c++ rdma-core rdma-core-devel libnl3-devel numactl numactl-devel libpcap-devel readline-devel libnml-devel


编译DPDK

官方下载页面:http://core.dpdk.org/download/
1、下载源码。
从官网下载DPDK-18.11.11源码。
wget http://fast.dpdk.org/rel/dpdk-18.11.11.tar.xz
2、解压并进入源码目录。
tar -xf dpdk-18.11.11.tar.xz
cd dpdk-stable-18.11.11/config/ && ls

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

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

等待编译完成。

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

最后输入“35”退出。
5、查看网卡信息。
./dpdk-devbind.py -s

问题分析

问题现象及复现

问题现象

编译安装DPDK后,用DPDK自带的helloworld示例程序测试,用于验证DPDK环境是否正常。

测试过程报错截图:

网卡驱动状态截图:

复现条件

在1-环境信息的环境下,并准备好3-环境部署后,执行helloworld示例程序测试,问题可以复现。

复现过程

1、编译生成DPDK自带的helloworld示例程序并运行。

2、指定用户态驱动igb_uio并绑定bus号为0000:01:00.1的网卡。

3、执行helloworld示例程序测试,指定用户态驱动的网口出现问题,其余网口正常。

4、用DPDK自带test-pmd测试程序验证,指定用户态驱动的网口出现问题,其余网口正常。

具体分析

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

绑定网口前:

绑定网口后:

如果是这样的话,用网口创建VF,创建VF的同时会生成新的bus号,把VF绑定到用户态驱动igb_uio,就不会和网口内核态驱动有bus号冲突。

验证步骤如下:

1、创建VF。

echo 1 > /sys/class/net/enp1s0f1/device/sriov_numvfs

 

2、dpdk命令查看生成的VF。

./dpdk-devbind.py -s

3、指定用户态驱动igb_uio并绑定bus号为0000:01:2的VF。

4、执行helloworld示例程序测试。

5、切换为vfio驱动。

运行失败,说明存在其他地方被限制。


验证驱动版本兼容问题

IGB_UIO、VFIO驱动都是虚拟化强相关特性,使能硬件和操作系统虚拟化参数选项,高版本的网卡驱动兼容性更高,也一并升级下。

升级网卡驱动

./mlnxofedinstall --dpdk





修改系统内核启动参数

1、添加grub选项。

在grub文件中添加:

iommu.passthrough=1 pci=pcie_bus_perf pciehp.pciehp_force=1

2、重启后进BIOS确认smmu为enabled(硬件虚拟化开关)。

3、重启后网卡驱动升级成功。


验证切IGB_UIO和VFIO驱动是否正常

升级网卡驱动重启后,需要重新加载IGB_UIO、VFIO驱动。

1、重新加载IGB_UIO驱动。存在报错信息。

2、加载vfio驱动。

3、切vfio驱动,查看dpdk是否接管正常。

4、挂载大页内存。

5、执行helloworld。

6、重新编译dpdk后执行helloworld。

结论:不是驱动版本问题。


验证DPDK程序自动切换功能

默认使用mlx5_core的网卡,无论是helloworld还是test-pmd测试都正常。推断CX4网卡已经不需要切驱动,可用DPDK程序直接接管(自动切换)。
不手动切换驱动,物理网口和VF用helloworld测试正常。




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



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



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

2、启动DPDK之前,不需要为Mellanox绑定igb_uio或者uio_pci_generic等用户态驱动(https://zhuanlan.zhihu.com/p/484252751)。
3、网卡使用mlx5_core驱动之后就不再依赖内核的UIO框架,Mellanox会使用它特有的mlx5_core驱动来完成Mellanox 网卡(PCI 设备)的注册。https://tool.4xseo.com/a/2118.html

 定位结论

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

本页内容