我可以在 dma_sync_single_for_cpu 之后调用 dma_unmap_single 吗?

Can I call dma_unmap_single after dma_sync_single_for_cpu?

我有一种情况需要在 dma_sync_single_for_cpu 之后调用 dma_unmap_single。下面是我的场景。

  1. 使用 kmalloc()
  2. 为缓冲区分配内存
  3. 使用 dma_map_singleDMA_FROM_DEVICE 方向将缓冲区映射到设备。
  4. 接收数据包后,使用dma_sync_single_for_cpu获取缓冲区所有权。
  5. 一段时间后,如果内核中的某些其他函数使用相同的缓冲区,则使用 dma_unmap_singleDMA_FROM_DEVICE 方向从设备取消映射缓冲区。

以上步骤都可以接受吗?

缓冲区 "ownership"(CPU 或设备)仅对决定允许谁访问缓冲区的内容很重要。

dma_unmap_single()不关心内容;它可以在任何状态下调用。

请注意,在 DMA 取消映射后,内存再次 "belongs" 到 CPU。如果您只进行一次 DMA 传输,则不需要调用 dma_sync_single_for_cpu();您可以在 dma_unmap_single() 调用后读取缓冲区。