как сделать mmap для кэшируемого PCIe BAR

Я пытаюсь написать драйвер с пользовательской функцией mmap() для PCIe BAR с целью сделать этот BAR кэшируемым в кеше процессора. Я знаю, что это не лучший способ достичь максимальной пропускной способности и что порядок записи непредсказуем (в этом случае тоже нет проблем).

Это похоже на то, что описано в Как предотвратить кэширование значений MMAP ?

Процессор - Sandy Bridge i7, устройство PCIe - устройство Altera Stratix IV. доска.

Сначала я попытался сделать это на CentOS 5 (2.6.18). Я изменил настройки MTRR, чтобы убедиться, что BAR не находится в некэшируемом MTRR, и использовал io_remap_pfn_range() с очищенными битами _PAGE_PCD и _PAGE_PWT. Чтения работали, как ожидалось: чтение вернуло правильные значения, и второе чтение по тому же адресу не обязательно приводит к переходу чтения в PCIe (счетчик чтения был проверен в FPGA). Однако в результате записи система зависала, а затем перезагружалась без каких-либо сообщений в журналах или на экране.

Во-вторых, я попытался сделать это на CentOS 6 (2.6.32) с поддержкой PAT. Результат тот же: чтение работает правильно, запись вызывает зависание системы и перезагрузку. Интересно, что невременная / комбинированная запись в полную строку кэша (AVX / SSE) работает должным образом, то есть они всегда переходят на FPGA, а FPGA наблюдает за полной записью строки в кэш, после чего чтение возвращает правильные значения. Однако простая 64-битная запись по-прежнему вызывает зависание / перезагрузку системы.

Я также пробовал ioremap_cache(), а затем iowrite32() внутри кода драйвера. Результат тот же.

Я думаю, что это проблема с оборудованием, но я был бы признателен, если бы кто-нибудь поделился своими идеями о том, что происходит.

РЕДАКТИРОВАТЬ: мне удалось захватить сообщение MCE на CentOS 6: Исключение проверки компьютера: 5 Банк 5: be2000000003110a.

Я также пробовал тот же код на 2-сокетном Sandy Bridge (Romley): поведение чтения и невременной записи такое же, простые записи не вызывают сбой MCE / сбоя, но не влияют на состояние системы, т.е. значение в памяти не изменяется .

Кроме того, я пробовал тот же код на более старой двухпроцессорной системе Nehalem: простая запись также вызывает MCE, хотя коды разные.


person sols    schedule 28.06.2012    source источник


Ответы (1)


Мне неизвестно какое-либо оборудование x86, которое поддерживает тип памяти WriteBack (WB) для адресов MMIO, и вы почти наверняка видите результат этой несовместимости. Я опубликовал обсуждение этой темы в своем блоге по адресу http://blogs.utexas.edu/jdm4372/2013/05/29/ и http://blogs.utexas.edu/jdm4372/2013/05/30/

В этих публикациях я обсуждаю метод, который работает на некоторых процессорах - дважды сопоставьте диапазон MMIO - один раз для операций сохранения от процессора к FPGA с использованием типа памяти с объединением записи (WC) и один раз для чтения из процессора. к ПЛИС с использованием типов защиты от записи (WP) или сквозной записи (WT). Вам нужно будет поддерживать согласованность вручную, используя CLFLUSH в строках кэша в области «только для чтения», когда вы выполняете запись в псевдоним этой строки в области «только для записи». Вам также потребуется вручную поддерживать согласованность в отношении изменений значений в памяти FPGA, поскольку устройства ввода-вывода не могут генерировать транзакции аннулирования кеша для адресов MMIO.

Моя команда сделала это несколько лет назад, когда я работал в AMD, и сейчас я пытаюсь понять, как это сделать с новыми ядрами Linux и с процессорами Intel. Linux не поддерживает напрямую типы памяти WP или WT со своими предопределенными функциями сопоставления, поэтому требуется некоторый взлом .... Довольно легко переопределить MTRR для региона, но у меня больше проблем с поиском правильного места ( s) в потомках функции remap_pfn_range (), которые мне нужно изменить, чтобы получить атрибут WP или WT, установленный в записях PAT для диапазона.

Этот метод, вероятно, лучше подходит для FPGA, чем для других (предварительно определенных) типов устройств ввода-вывода, поскольку программируемость FPGA позволяет гибко определять PCI BAR для работы в этом режиме с двойным отображением и взаимодействия с процессором. побочный драйвер в поддержании согласованности кеша.

person John D McCalpin    schedule 06.06.2013