我可以在 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
。下面是我的场景。
- 使用
kmalloc()
为缓冲区分配内存
- 使用
dma_map_single
和 DMA_FROM_DEVICE
方向将缓冲区映射到设备。
- 接收数据包后,使用
dma_sync_single_for_cpu
获取缓冲区所有权。
- 一段时间后,如果内核中的某些其他函数使用相同的缓冲区,则使用
dma_unmap_single
和 DMA_FROM_DEVICE
方向从设备取消映射缓冲区。
以上步骤都可以接受吗?
缓冲区 "ownership"(CPU 或设备)仅对决定允许谁访问缓冲区的内容很重要。
dma_unmap_single()
不关心内容;它可以在任何状态下调用。
请注意,在 DMA 取消映射后,内存再次 "belongs" 到 CPU。如果您只进行一次 DMA 传输,则不需要调用 dma_sync_single_for_cpu()
;您可以在 dma_unmap_single()
调用后读取缓冲区。
我有一种情况需要在 dma_sync_single_for_cpu
之后调用 dma_unmap_single
。下面是我的场景。
- 使用
kmalloc()
为缓冲区分配内存
- 使用
dma_map_single
和DMA_FROM_DEVICE
方向将缓冲区映射到设备。 - 接收数据包后,使用
dma_sync_single_for_cpu
获取缓冲区所有权。 - 一段时间后,如果内核中的某些其他函数使用相同的缓冲区,则使用
dma_unmap_single
和DMA_FROM_DEVICE
方向从设备取消映射缓冲区。
以上步骤都可以接受吗?
缓冲区 "ownership"(CPU 或设备)仅对决定允许谁访问缓冲区的内容很重要。
dma_unmap_single()
不关心内容;它可以在任何状态下调用。
请注意,在 DMA 取消映射后,内存再次 "belongs" 到 CPU。如果您只进行一次 DMA 传输,则不需要调用 dma_sync_single_for_cpu()
;您可以在 dma_unmap_single()
调用后读取缓冲区。