我的问题是:当我[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似乎是DMA同步(目前通用的统一间接机制include/asm-generic/dma-mapping-common.h通过字段)sync_single_for_{cpu,device}的dma_map_ops,但到目前为止,我一直没能找到这些操作的任何定义.