У меня такой вопрос: как я могу определить, когда безопасно отключить отслеживание кеша, если я правильно использую [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
, но пока мне не удалось найти никаких определений этих операций.