【发布时间】:2011-10-31 05:30:56
【问题描述】:
我的问题是:当我在设备驱动程序中正确使用[pci_]dma_sync_single_for_{cpu,device} 时,如何确定何时可以安全地禁用缓存侦听?
我正在为通过 PCI Express (DMA) 直接写入 RAM 的设备开发设备驱动程序,并且担心管理缓存一致性。我可以在启动 DMA 时设置一个控制位,以在 DMA 期间启用或禁用缓存侦听,显然为了提高性能,我希望尽可能禁用缓存侦听。
在中断例程中,当切换 DMA 缓冲区时,我酌情调用 pci_dma_sync_single_for_cpu() 和 ..._for_device(),但在 32 位 Linux 2.6.18 (RHEL 5) 上,事实证明这些命令是扩展为空的宏。 .. 这解释了为什么我的设备在此内核上禁用缓存侦听时返回垃圾!
我浏览了内核源代码的历史,似乎在 2.6.25 之前只有 64 位 x86 具有用于 DMA 同步的挂钩。从 2.6.26 开始,似乎有一个通用的统一间接机制,用于通过 dma_map_ops 的字段 sync_single_for_{cpu,device} 进行 DMA 同步(目前在 include/asm-generic/dma-mapping-common.h),但到目前为止我还没有找到这些操作的任何定义。
【问题讨论】:
-
有一些关于 DMA 和缓存一致性的 lwn 文章,您可能想在 lwn.net 上查看
-
您是否衡量了通过禁用缓存侦听获得的性能提升,不仅在传输本身上,而且在整个应用程序上? DMA 相干性非常方便,并且让我更容易考虑与硬件交互,因此我会在关闭它之前仔细测量。
标签: linux linux-kernel kernel dma