http://lkml.indiana.edu/hypermail/linux/kernel/0709.0/1329.html
я такой вопрос: как я могу определить, когда безопасно отключить отслеживание кэша, когда я правильно использую[pci_]dma_sync_single_for_{cpu,device}
в моем драйвере устройства?
Я работаю над драйвером устройства для устройства, которое записывает напрямую в ОЗУ через PCI Express (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
, но до сих пор мне не удалось найти какие-либо определения этих операций.