c - Linux 内核 : Is it OK to leave a streaming DMA mapping open indefinitely?

标签 c linux-device-driver dma

许多关于设备驱动程序编程的指南建议流式 DMA 映射(即由 dma_map_single() 和 friend 创建的映射)尽可能短地保持打开状态,因为它们会消耗资源(即IOMMU 映射资源(如果平台有的话),或者在需要时有反弹缓冲区)。

在我的例子中,我使用的是支持 64 位 DMA 的 PCIe 设备,因此应该不需要反弹缓冲区(而且在这种情况下似乎也不需要 IOMMU 的特殊处理,正确的?)。数据来自设备(即它与 DMA_TO_CPU 映射),当新数据通过中断可用时设备会通知我,此时我触发 dma_sync_for_cpu() 在访问刚刚通过 DMA 发送给我的数据之前。

还有其他原因我不应该无限期地让映射保持打开状态(当然,直到数据使用者关闭为止)吗?

最佳答案

我在 Linux 内核源代码中至少发现了一个实例,其中流式 DMA 映射可能会在不确定的时间内保持打开状态:

在用于处理等时DMA的火线驱动程序代码(drivers/firewire/core-iso.c)中,当用户空间调用mmap()时建立DMA映射,并且只要用户空间保持设备打开,此映射就会保持打开状态。

关于c - Linux 内核 : Is it OK to leave a streaming DMA mapping open indefinitely?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20979107/

相关文章:

c++ - 全局变量的顺序会改变 C++/OpenGL 中的性能

c - 元组字典搜索未返回完整字符串

linux - 内核函数 asm_do_IRQ() 中的 irq 与我在模块中请求的不同

network-programming - 多线程应用程序中的直接内存访问 (DMA) 调度

Linux DMA API : specifying address increment behavior?

c - 二维数组转化为指针

c - 从 Linux 桌面启动的程序的默认标准输入和标准输出是什么?

c - Linux 信号量初始化 : error implicit declaration of function 'semaphore_init'

Linux Kernel out of tree Driver Compilation failed with BUILD_BUG_ON_ZERO

caching - DMA/Microblaze 直接访问用户空间页面物理地址后读取错误数据(内核分散/聚集)