0

我正在研究使用 SPDK/VFIO API 进行 dma 访问的用户空间 PCI 驱动程序。

目前对于每个 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每次都调用?

任何想法都值得赞赏。

4

1 回答 1

0

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

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

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

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

于 2019-09-25T20:13:36.543 回答