我正在开发一个用户空间PCI驱动程序,它使用SPDK/VFIO进行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调用?
任何想法都是很受欢迎的。
发布于 2019-09-25 20:13:36
不知道我是否得到了这个问题,但是整个想法( DPDK和SPDK)是分配您在应用程序启动或驱动程序探测时使用的所有内存。
如果您使用的内存一直处于应用程序控制之下,那么您不需要在每个DMA事务中执行VFIO_IOMMU_MAP_DMA和VFIO_IOMMU_UNMAP_DMA。如果不是这样的话,您有两个选择:
VFIO_IOMMU_MAP_DMA和VFIO_IOMMU_UNMAP_DMAVFIO_IOMMU_MAP_DMA中注册的内存。第一个选项更适合巨大的内存块,而第二个选项更适合小IO块。
https://stackoverflow.com/questions/57700675
复制相似问题