[pci_]dma_sync_single_for_{cpu,device}
我的问题是:当我在设备驱动程序中正确使用时,如何确定何时可以安全地禁用缓存侦听?
我正在为通过 PCI Express (DMA) 直接写入 RAM 的设备开发设备驱动程序,并且担心管理缓存一致性。我可以在启动 DMA 时设置一个控制位,以在 DMA 期间启用或禁用缓存侦听,显然为了性能,我希望尽可能禁用缓存侦听。
在我调用的中断例程中pci_dma_sync_single_for_cpu()
,并且..._for_device()
在适当的情况下,在切换 DMA 缓冲区时,但在 32 位 Linux 2.6.18 (RHEL 5) 上,事实证明这些命令是扩展为空的宏......这解释了为什么我的设备返回垃圾在此内核上禁用缓存侦听时!
我浏览了内核源代码的历史,似乎直到 2.6.25 只有 64 位 x86 具有用于 DMA 同步的挂钩。从 2.6.26 开始,似乎有一个通用的统一间接机制,用于include/asm-generic/dma-mapping-common.h
通过 的字段进行 DMA 同步(目前在 )sync_single_for_{cpu,device}
,dma_map_ops
但到目前为止,我还没有找到这些操作的任何定义。