Управление согласованностью кэша DMA

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

21
задан osgx 25 August 2011 в 14:46
поделиться