如何提高用户空间 DMA 访问的 SPDK 性能?



我正在开发一个用户空间PCI驱动程序,该驱动程序使用SPDK/VFIO API进行dma访问。

目前,对于每个 DMA 分配请求,我需要填写结构spdk_vfio_dma_map然后调用系统调用ioctl(fd, VFIO_IOMMU_MAP_DMA, &dma_map)通过 IOMMU 映射 DMA 区域。然后稍后调用ioctl(fd, VFIO_IOMMU_UNMAP_DMA, &dma_map)以取消映射 IOMMU 映射。

到目前为止,这工作正常,看起来这就是 SPDK 示例正在使用的。但是,我想知道是否有办法预先分配用户空间中的所有内存缓冲区,然后在每个 DMA 分配请求中仅使用预分配的内存而不是每次都执行ioctl调用?

任何想法都值得赞赏。

不知道我是否遇到问题,但整个想法(DPDK 和SPDK(是分配您在应用程序启动或驱动程序探测时使用的所有内存。

如果您始终使用受应用程序控制的内存,则无需执行VFIO_IOMMU_MAP_DMAVFIO_IOMMU_UNMAP_DMA每个 DMA 事务。如果不是这种情况,您有两种选择:

  1. 为每个 IO 执行VFIO_IOMMU_MAP_DMAVFIO_IOMMU_UNMAP_DMA
  2. 将有效负载复制到已在VFIO_IOMMU_MAP_DMA中注册的内存。

第一个选项更适合大型内存块,而第二个选项更适合小 IO 块。

最新更新