Возможно ли выполнять запись на несколько устройств, которые используют разные линии PCIe в одном слоте PCIe?

Я пишу драйвер устройства Linux, который поддерживает несколько устройств. У меня есть карта x8 PCIe с 4 из этих устройств на нем. Каждый работает через коммутатор PCIe и получает 2 линии PCIe. Есть ли способ, чтобы драйвер записывал на несколько дорожек одновременно? Если так, как бы я это сделал? Я думаю, что это возможно, поскольку все это в одном слоте PCIe, но я понятия не имею, как это будет сделано с помощью драйвера.

2 ответа

Решение

Похоже, вы ищете PCIe multicast. Это не имеет никакого отношения к числу дорожек, но будет просто функцией доставки одной записи по нескольким адресатам настолько эффективно, насколько это возможно. Для этого существует стандарт, в основном предназначенный для использования объединительной платой, см. http://www.pcisig.com/developers/main/training_materials/get_document?doc_id=12f5c260ccf5e054366d4c96ee655fa6827db5b3

Похоже, что это поддерживается с новым типом PCI BAR, где несколько устройств будут иметь одинаковый диапазон отображаемых физических адресов, и коммутатор также будет настроен на получение информации об этом диапазоне многоадресной рассылки. Но все это требует поддержки ОС, и я не нашел ничего в Интернете, чтобы предположить, что у Linux есть части, необходимые для настройки устройств, чтобы делать все это.

Поскольку ваша родительская ссылка имеет достаточную пропускную способность для насыщения всех четырех дочерних ссылок, у вас нет проблем с пропускной способностью. Единственное, что вы сохраните с помощью многоадресной рассылки, это пропускная способность подсистемы памяти. Если у вас современная архитектура, то сумма, которую вы сэкономите, будет в шуме.

Другими словами, не беспокойтесь об этом. Относитесь к своим устройствам как к независимым (в любом случае это сделает водителя чище) и продолжайте свой проект.

PCIe работает не совсем так, как вы думаете. Коммутатор не разделяет восходящую ссылку x8 на несколько ссылок x2 - он просто перенаправляет трафик с одной ссылки на другую. Итак, вы увидите ссылку x8 на коммутатор, а затем ссылку 4 x2 от коммутатора к последующим устройствам. Однако с другим коммутатором и другими нисходящими устройствами одинаково возможно (например) иметь ссылки x8 везде, то есть канал x8 от корневого порта до коммутатора и x8 ссылки от коммутатора до устройств ниже по потоку.

Однако в вашем случае у вас есть согласованная полоса пропускания с обеих сторон коммутатора, поэтому не должно быть проблем с устройствами, конкурирующими за ограниченную полосу пропускания. Ваш драйвер может общаться со всеми устройствами одновременно так же эффективно, как если бы были независимые ссылки.

Другие вопросы по тегам