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

How can I improve SPDK performance on userspace DMA access?

我正在开发一个用户空间 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)是分配您在应用程序启动或驱动程序探测时使用的所有内存。

如果您一直在使用受应用程序控制的内存,那么您不需要在每个 DMA 事务中执行 VFIO_IOMMU_MAP_DMAVFIO_IOMMU_UNMAP_DMA。如果不是这种情况,您有两个选择:

  1. 为每个 IO
  2. 执行 VFIO_IOMMU_MAP_DMAVFIO_IOMMU_UNMAP_DMA
  3. 将payload复制到已经在VFIO_IOMMU_MAP_DMA中注册的内存中。

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