当前位置: 首页 > news >正文

解决dpdk reserve的内存返回的虚拟地址和iova地址一样的问题

1. 背景:

在ubuntu20.04上用dpdk API: 

rte_memzone_reserve_aligned("L1L2_PCIE_MEMORY", 1.5*1024*1024*1024,
                         rte_socket_id(), RTE_MEMZONE_1GB|RTE_MEMZONE_IOVA_CONTIG, 
                         RTE_CACHE_LINE_SIZE);

分配1.5G 内存.

服务器和mvl PCIE卡通过这个内存进行交互.

正常情况下:

服务器使用dpdk返回的虚拟地址,  mvl pcie卡上用dpdk 返回的iova地址, 然后调用DPI 的API 可以实现数据的上传和下载.

期望的虚拟地址和iova地址是不一样的. 但是实际上打印是一样的:

这种情况下表示把虚拟地址作为iova 地址. 二者一样.

那传给mvl pcie卡的其实是一个虚拟地址. 导致mvl 卡把数据push到了未知的地址.

因为这个功能在之前测试过的,两个地址不应该一样, 所以打印日志看下哪不一样: 加参数: --log-level=eal,8

对比之前的日志和现在不行的日志, 如下:

 发现出错时用的iova 模式是VA 模式, 这个情况下就会让iova, va一样. 在服务器上的app 操作的其实是虚拟地址.mvl 卡把数据push到了未知的地址(应该用物理地址但用成了虚拟地址),  这样服务器和mvl pcie卡就不能通信.

开始认为是ubuntu grub下打开了iommu 功能导致的.但是查看了其他服务器也是这样的.

猜想应该是可以配置的. 因为之前看dpdk 源码中是有初始iova模式的.

baidu了下, 发现以下参数可以改变iova模式:

参考DPDK内存管理——iova地址模式(虚拟/ 物理 地址)_light_forest的博客-CSDN博客

加入 --iova-mode=pa 参数后, dpdk分配出来的地址就一样了. 打印如下:

后边再执行pcie 卡上的程序, 两个程序可以正常通信 了.

http://www.lryc.cn/news/89998.html

相关文章:

  • JQuery实现小项目
  • 【C++/嵌入式笔试面试八股】一、23.结构体指针 | 指针和引用 | 万能指针 | 野指针
  • 【C++初阶】类和对象(下)构造函数(初始化列表) + explicit关键字 +static成员
  • chatgpt赋能python:Python代码怎么用?一个10年编程经验工程师的实践总结
  • 【Android定制】修改BUILD_AGO_GMS = no 和 BUILD_GMS=no属性
  • 第十章:C语言的调试
  • 【20】SCI易中期刊推荐——计算机信息系统工程电子与电气(中科院3区)
  • 初识网络之UDP网络套接字
  • 数据中心末端配电的数字化方案及设备选型
  • k8s入门实战-Service
  • Python量化交易:策略创建运行流程
  • 企业该如何自主构建信息化管理系统?
  • linuxOPS基础_操作系统概述
  • 常用adb命令记录下
  • Etcdctl 命令v3
  • 第二十一章 开发Productions - ObjectScript Productions - 延迟发送
  • 用vue-full-calendar实现酒店预定管理展示
  • DirectX12环境配置(1)
  • Go-异常处理(defer recover panic)
  • 【完美解决】mysql启动不了:本地计算机上的MySQL服务启动后停止
  • C++ Qt 项目设计:基于C++与Qt的跨平台定时关机/关屏应用开发
  • Python新技术和趋势:如何应对Python生态的变化和发展趋势
  • Flutter 又一元老离职,感谢 Tim 这些年的付出
  • C++学习笔记3:sort和priority_queue的比较器重载
  • Java之旅——Mybatis
  • 抽奖中的分布式锁应用
  • 项目总结 车牌识别
  • 一台服务器通过apache安装多个web应用
  • 网络连通性测试
  • AntDB-S流式数据库体验