解决dpdk reserve的内存返回的虚拟地址和iova地址一样的问题 | 您所在的位置:网站首页 › 调用浏览器的打印功能在哪 › 解决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 卡上的程序, 两个程序可以正常通信 了. |
CopyRight 2018-2019 实验室设备网 版权所有 |