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 卡上的程序, 两个程序可以正常通信 了.