Мой вопрос заключается в следующем: как я могу определить, когда безопасно отключать отслеживание кэша, когда я правильно использую [pci_]dma_sync_single_for_{cpu,device}
в своем драйвере устройства?
Я работаю над драйвером устройства для устройства, которое напрямую записывается в ОЗУ через PCI Express (DMA), и я обеспокоен управлением связностью кеша. Есть бит управления, который я могу установить при запуске 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
, но до сих пор мне не удалось найти никаких определений этих операций.