dpdk-19.11 arm64 环境适配 Mellanox CX4 网卡

2024-06-05 09:52

本文主要是介绍dpdk-19.11 arm64 环境适配 Mellanox CX4 网卡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境信息

cpu: arm64 架构
dpdk 版本:19.11
glibc 版本:2.17
网卡型号:
Mellanox CX4 网卡,详细 pci 信息如下:

02:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
02:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]

cx4 dpdk 驱动适配

确认 dpdk 是否支持

查找驱动代码,mlx5_pci_id_map 中列举了支持的网卡标识,部分摘要如下:

 PCI_DEVICE_ID_MELLANOX_CONNECTX4LXVF = 0x1016,static const struct rte_pci_id mlx5_pci_id_map[] = {{RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_CONNECTX4)},{RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_CONNECTX4VF)},{RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_CONNECTX4LX)},{RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_CONNECTX4LXVF)},

确认 mlx5 驱动支持 CX4 网卡,需要编译出一个支持 mlx5 驱动的 dpdk 版本给产品进行集成。

配置文件中开启 mlx5 驱动

将 arm64 的配置文件中CONFIG_RTE_LIBRTE_MLX5_PMD 项目设置为 y,这样 dpdk 编译时会编译 mlx5 驱动。

mlx5 驱动的特点

  1. 网卡正常驱动运行依赖多个内核模块

    x86 平台成功适配的环境中,麦洛斯相关模块加载命令列举如下:

    modprobe mlx5_coremodprobe ib_umad
    modprobe ib_uverbsmodprobe mlx5_ibvers
    modprobe mlx5_ib
    modprobe mlxfw
    modprobe tls
    modprobe pci-hyperv
    modprobe vmw_pvrdma
    modprobe rdma_ucm
    modprobe psample
    

    前期成功经验表明至少需要 5.0 以上的内核才能支持,需要选择支持 arm64 架构的 5.0 以上版本内核

  2. 编译依赖三方 rdma-core 库与头文件

    由于我们的 rootfs 是定制版本,且 glibc 版本很低,基本都是古董版本,要基于源码方式编译出依赖的三方库难度会非常大,优先从互联网上检索可用的版本,实在没有版本可用时则考虑自行编译。

内核版本选型

对照依赖模块,选择了内部维护的只是 arm64 架构的 5.4.18 内核,首先检索内核发布 ko 路径中相关 ko 信息,搜索到如下内容:

kernel/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko.xz
kernel/drivers/infiniband/core/ib_umad.ko.xz
kernel/drivers/infiniband/core/ib_uverbs.ko.xzkernel/drivers/infiniband/hw/mlx5/mlx5_ib.ko.xz
kernel/drivers/net/ethernet/mellanox/mlxfw/mlxfw.ko.xzkernel/net/tls/tls.ko.xz
kernel/drivers/pci/controller/pci-hyperv.ko.xz
kernel/drivers/infiniband/hw/vmw_pvrdma/vmw_pvrdma.ko.xz
kernel/drivers/infiniband/core/rdma_ucm.ko.xz
kernel/net/psample/psample.ko.xz

仅缺少 mlx5_ibvers,查看内核源码确认此驱动在此版本不需要,评估 5.4.18 能够满足要求。修改 grub 文件,增加新的配置项目使用新的内核,测试确定如下条件满足:

  1. mlx5_core、ib_uverbs 等模块成功加载
  2. 网卡成功绑定到 mlx5_core 驱动,netdev 设备成功生成, /dev/infiniband/uverbsX 设备文件成功生成

mlx5 编译依赖选择

初次获取依赖的 rpm 包获取地址:

wget -c <https://rpmfind.net/linux/centos/8-stream/BaseOS/aarch64/os/Packages/libnl3-3.5.0-1.el8.aarch64.rpm>
wget -c <https://rpmfind.net/linux/centos/8-stream/BaseOS/aarch64/os/Packages/libibverbs-37.2-1.el8.aarch64.rpm>
wget -c <https://rpmfind.net/linux/centos/8-stream/BaseOS/aarch64/os/Packages/rdma-core-devel-37.2-1.el8.aarch64.rpm>

运行发现存在依赖高版本 glibc,无法在环境中运行,启动报错如下:

bash-4.2# ./l2fwd
./l2fwd: /lib/libc.so.6: version `GLIBC_2.25' not found (required by /usr/lib64/libmlx5.so.1)

进一步分析确定,仅依赖 GLIBC 2.25 getrandom 符号,这个符号低版本 glibc 并不具备,因此不能直接使用。

仅仅缺少一个符号就宣告失败让人有些惋惜,于是想着有没有什么方式能把这个缺少的符号加上,一通搜索还真的搜索到了一篇帖子——https://jakub-jozwicki.medium.com/is-it-possible-to-add-missing-functions-to-libc-so-6-via-ld-preload-c6515b82abd6,参照帖子里的内容并做了一些修改,最终能链接通过,但是运行是仍旧报相同的错误,只能放弃。

再次搜索获取到如下版本的 rpm 包:

wget -c <https://rpmfind.net/linux/centos/8-stream/BaseOS/aarch64/os/Packages/libnl3-3.5.0-1.el8.aarch64.rpm>
wget -c <https://buildlogs.cdn.centos.org/c7.1810.00.aarch64/rdma-core/20181031053230/17.2-3.el7.aarch64/libibverbs-17.2-3.el7.aarch64.rpm>
wget -c <https://buildlogs.cdn.centos.org/c7.1810.00.aarch64/rdma-core/20181031053230/17.2-3.el7.aarch64/rdma-core-17.2-3.el7.aarch64.rpm>
wget -c <https://buildlogs.cdn.centos.org/c7.1810.00.aarch64/rdma-core/20181031053230/17.2-3.el7.aarch64/rdma-core-devel-17.2-3.el7.aarch64.rpm>

这次比较幸运,测试通过,能够正常运行。

基于 l2fwd 测试记录如下:

[root@localhost]# ./l2fwd  -- -p0x3
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
............................................................................
EAL:   probe driver: 15b3:1015 net_mlx5
libibverbs: Warning: couldn't open config directory '/etc/libibverbs.d'.
net_mlx5: MPLS over GRE/UDP tunnel offloading disabled due to old OFED/rdma-core version or firmware configuration
............................................................................

测试 l2fwd 能够正常运行,打流确认流量能够正常转发。

dlopen 方式加载 mlx5 驱动依赖的三方库

mlx5 驱动默认动态链接 libibverbs.so 与 libmlx5.so,开启了 mlx5 驱动后,新发布的 dpdk 库在使用时如果链接到了 mlx5 pmd 驱动时需要添加新的链接参数才能够正常编译,最好不需要添加任何额外的链接参数,这样兼容性好些。

研究了一下,发现开启 CONFIG_RTE_IBVERBS_LINK_DLOPEN 配置能够解决这个问题,开启会这些库会通过 dlopen 在运行时加载,这样依赖 dpdk 库的程序编译时就不需要添加额外的链接参数了。

同时修改了 mlx5 Makefile 中的内容,设置了三方库的头文件与库的位置及必要的链接参数。

参考链接

https://blog.csdn.net/qq_36393978/article/details/118700062

https://lore.kernel.org/all/20220227102435.4275f945@hermes.local/T

这篇关于dpdk-19.11 arm64 环境适配 Mellanox CX4 网卡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032741

相关文章

Centos环境下Tomcat虚拟主机配置详细教程

《Centos环境下Tomcat虚拟主机配置详细教程》这篇文章主要讲的是在CentOS系统上,如何一步步配置Tomcat的虚拟主机,内容很简单,从目录准备到配置文件修改,再到重启和测试,手把手带你搞定... 目录1. 准备虚拟主机的目录和内容创建目录添加测试文件2. 修改 Tomcat 的 server.X

VSCode配置Anaconda Python环境的实现

《VSCode配置AnacondaPython环境的实现》VisualStudioCode中可以使用Anaconda环境进行Python开发,本文主要介绍了VSCode配置AnacondaPytho... 目录前言一、安装 Visual Studio Code 和 Anaconda二、创建或激活 conda

pytorch+torchvision+python版本对应及环境安装

《pytorch+torchvision+python版本对应及环境安装》本文主要介绍了pytorch+torchvision+python版本对应及环境安装,安装过程中需要注意Numpy版本的降级,... 目录一、版本对应二、安装命令(pip)1. 版本2. 安装全过程3. 命令相关解释参考文章一、版本对

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

Windows环境下安装达梦数据库的完整步骤

《Windows环境下安装达梦数据库的完整步骤》达梦数据库的安装大致分为Windows和Linux版本,本文将以dm8企业版Windows_64位环境为例,为大家介绍一下达梦数据库的具体安装步骤吧... 目录环境介绍1 下载解压安装包2 根据安装手册安装2.1 选择语言 时区2.2 安装向导2.3 接受协议

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2