Кто-нибудь может объяснить мне связь между libibverbs и librxe?

Я изо всех сил пытаюсь понять связь между libibverbs и librxe и низкоуровневым драйвером ядра для HCA.

В частности, у меня есть следующие сомнения:

  • Когда пакет поступает на HCA, низкоуровневый драйвер ядра передает пакет приложению пользовательского пространства. Здесь задействована копия памяти. Где на этой картинке сидят libibverbs и librxe?
  • Точно так же команда отправки, введенная пользователем, должна иметь возможность напрямую обращаться к оборудованию через низкоуровневый драйвер. Какая необходимость иметь библиотеки пользовательского пространства в этом случае?

person byslexia    schedule 20.06.2014    source источник


Ответы (3)


Реализация команд InfiniBand состоит примерно из четырех компонентов:

  • модуль ядра конкретного поставщика (например, ib_mthca для устройств Mellanox)
  • модуль ядра, который разрешает доступ к командам из пользовательского пространства (ib_uverbs)
  • библиотека драйверов поставщика пользовательского пространства (например, libmthca)
  • связующий компонент между двумя предыдущими (libibverbs)

InfiniBand в целом поддерживает две семантики — работу на основе пакетов и удаленный доступ к памяти. Независимо от режима работы оба реализуют нулевое копирование путем прямого чтения и записи в буфер(ы) приложения. Это делается (как уже объяснил haggai_e) путем фиксации буфера в физической памяти (также называемой регистрацией), таким образом не позволяя диспетчеру виртуальной памяти выгружать его на диск или перемещать в физической ОЗУ. Очень приятной особенностью InfiniBand является то, что каждый HCA имеет собственный механизм преобразования виртуальных адресов в физические, который позволяет передавать указатели пользовательского пространства непосредственно на оборудование.

Причина использования драйвера пользовательского уровня заключается в том, что глаголы напрямую раскрывают аппаратные регистры HCA пользовательскому пространству, а каждый HCA имеет различный набор регистров, поэтому необходим промежуточный уровень пользовательского пространства. Конечно, его можно было бы полностью реализовать в ядре, а затем можно было бы использовать единую независимую от поставщика библиотеку пользовательского пространства, но InfiniBand очень старается обеспечить как можно более низкую задержку, и каждый раз проходить через ядро ​​будет очень дорого. Тот факт, что устройства RDMA могут транслировать виртуальные адреса самостоятельно, означает, что библиотеке пользовательского пространства не нужно проходить через ядро, чтобы получить физический адрес буфера при создании записей в рабочих очередях (часть механизма, используемого глаголами для отправки и получения данных).

Обратите внимание, что в основном есть две библиотеки поставщиков — одна в ядре и одна в пользовательском пространстве. Первый предоставляет функциональность глаголов для других модулей ядра, таких как файловые системы (например, Lustre) или драйверы сетевых протоколов (например, IP-over-InfiniBand), а второй предоставляет эту функциональность в пользовательском пространстве. Некоторые операции не могут быть выполнены полностью в пользовательском пространстве, например. регистрация памяти или открытие/закрытие контекстов устройства, и они прозрачно передаются модулю ядра с помощью libibverbs.

Хотя технически RDMA через конвергентный Ethernet (RoCE, реализованный в пользовательском пространстве как librxe) не является InfiniBand на аппаратном уровне, стек OpenFabrics разработан таким образом, чтобы поддерживать оборудование с поддержкой RDMA, отличное от HCA InfiniBand, включая адаптеры RoCE и iWARP.

См. эту сводку от Intel по теме доступ к InfiniBand в Linux для получения более подробной информации.

person Hristo Iliev    schedule 27.06.2014
comment
Просто примечание о RoCE: хотя это не InfiniBand, это в значительной степени транспорт InfiniBand, отправляемый через Ethernet, и фактически он определен как часть спецификаций архитектуры InfiniBand. - person haggai_e; 30.06.2014
comment
@haggai_e, спасибо за примечание - я соответствующим образом отредактировал текст. - person Hristo Iliev; 30.06.2014
comment
Большое спасибо за подробный ответ. Я принял это! - person byslexia; 01.07.2014

Я не знаком конкретно с драйвером librxe, но в целом libibverbs будет обрабатывать запросы от приложения или библиотеки промежуточного программного обеспечения, используя его, и перенаправлять его вызовы в библиотеку провайдера, такую ​​как librxe. Библиотеки провайдеров также используют внутренние API в libibverbs для передачи команд модулям ядра RDMA (через модуль ib_uverbs).

Стек RDMA определен таким образом, чтобы разрешить прямой доступ к оборудованию из пользовательского пространства.

РЕДАКТИРОВАТЬ: я попытаюсь объяснить, как обойти копирование из пользовательского пространства в ядро ​​​​и наоборот, после вашего комментария.

Приложение, использующее libibverbs, зарегистрирует область памяти с помощью функции ibv_reg_mr. Эта функция вызовет команды ядра, чтобы определить страницы физической памяти, используемые областью виртуальной памяти, переданной в ibv_reg_mr. После слов драйвер ядра может получить доступ к этим страницам напрямую, не копируя информацию.

person haggai_e    schedule 23.06.2014
comment
Большое спасибо за ответ. Это, безусловно, помогло мне прояснить роль libibverbs. Я все еще не понимаю, как эта модель будет обходить копию из ядра в пользовательское пространство (на случай, если этот момент не ясен в моем вопросе). Я посмотрю на это больше и добавлю к ответу, если найду его. - person byslexia; 26.06.2014
comment
Конечно. Я отредактировал свой ответ и попытался добавить объяснение о нулевой копии. - person haggai_e; 26.06.2014

Пользовательское приложение-> Libverbs-> librxe (SoftRoce)-> ib_core.ko -> rdma_rxe.ko -> адаптер

Path of Control Channel , который сообщает адаптеру, где выполнять DMA из пользовательского пространства. Один Done , есть нулевая копия DMA адаптером для передачи на удаленный конец.

person Alok Prasad    schedule 29.11.2020