Я пытаюсь написать драйвер с пользовательской функцией 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, хотя коды разные.