每个dma_map_single调用都需要相应的dma_unmap_single吗?

我将一个大型代码库移植到Linux内核设备驱动程序中。 ASIC使用大量的DMA通道。

kmalloc内存与GFP_KERNEL|GFP_DMA 。 在启动DMA之前,我使用dma_map_single来获取硬件(物理)内存地址以供给硬件。 (也做一个刷新/无效的内存从dcache?)我有时需要CPU访问数据一旦DMA完成,但不经常。 在通过代码访问数据之前,我使用dma_unmap_single来避免caching一致性问题。

在我不需要CPU访问的情况下,是否还需要调用dma_unmap_single ? 我应该dma_unmap_single每个指针我dma_map_singledma_map_single是否消耗dma_unmap_single将释放的资源(例如,表格条目)?

DMA-API.txt在良好的DMA存储器卫生方面并不明确。

谢谢!

dma_map_single映射DMA传输的内存。 你得到的物理指针的内存,所以设备可以DMA的地址。

dma_unmap_single你可以取消映射上面映射的内存。 当你的转账结束后,你应该这样做。

您可以映射内存区域,并将其用于多个DMA传输,然后在作业完成时取消映射 。 每次要访问DMA存储器时,都必须对其进行同步。 如果设备要访问内存,则应该执行dma_sync_single_for_device ; 它主机要访问内存,你应该做的dma_sync_single_for_cpu

dma_map api可能会分配反弹缓冲区,在这种情况下,您将需要调用dma_unmap函数。