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

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

高并发环境中保持幂等性

在高并发环境中保持幂等性是一项重要的挑战。幂等性指的是无论操作执行多少次,其效果都是相同的。确保操作的幂等性可以避免重复执行带来的副作用。以下是一些保持幂等性的常用方法: 唯一标识符: 请求唯一标识:在每次请求中引入唯一标识符(如 UUID 或者生成的唯一 ID),在处理请求时,系统可以检查这个标识符是否已经处理过,如果是,则忽略重复请求。幂等键(Idempotency Key):客户端在每次

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme