我正在开发一个用户空间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_DMA
并VFIO_IOMMU_UNMAP_DMA
每个 DMA 事务。如果不是这种情况,您有两种选择:
- 为每个 IO 执行
VFIO_IOMMU_MAP_DMA
和VFIO_IOMMU_UNMAP_DMA
- 将有效负载复制到已在
VFIO_IOMMU_MAP_DMA
中注册的内存。
第一个选项更适合大型内存块,而第二个选项更适合小 IO 块。