Зарегистрировать большой буфер для RDMA в модуле ядра Linux

Я новичок, экспериментирующий с использованием rdma (ib_verbs) в модуле ядра. Я получил пример кода от krping и возился с ним. Система работает на 64-битном Linux Centos с собственным ядром 3.10 Linux, для которого отключены прозрачные огромные страницы. Мне нужно большое (до 4 ГБ) пространство для чтения / записи RDMA, которое не должно быть смежным, поскольку я, скорее всего, буду записывать / читать не более 1 МБ за раз с удаленной стороны (произвольный доступ).

Вопрос:

  1. Должен ли я просто сделать тысячу раз 4MB kmalloc и зарегистрировать регион DMA? Насколько это плохо, дизайн разумно для выделения большого куска памяти, используя kmalloc вместо vmalloc? Я слышал, что это не должно быть сделано, и большая память должна быть получена только через vmalloc. Но адреса из vmalloc не подходят для DMA.
  2. Если нет, то что может быть хорошим альтернативным способом иметь буфер 4 ГБ, который может быть произвольным доступом с удаленной стороны?
  3. Как пользовательская среда rdma управляет этим типом буфера? Я вспомнил, что я только Malloc 4 ГБ памяти и вызова ibv_reg_mr, и он готов к использованию.

1 ответ

Решение

Пока вы не используете память, которая покрывает всю физическую память (что не рекомендуется для MR с поддержкой записи), вы должны использовать IB_WR_REG_MR рабочий запрос для регистрации вашей области памяти. Для этого вы бы использовали ib_map_mr_sg функция, которая принимает список разброса и размер страницы. Таким образом, в основном, вы можете зарегистрировать MR, который построен с кусками фиксированного размера, которые вы выбираете.

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

Пространство пользователя обрабатывает большую регистрацию MR, звоня get_user_pages и используя системный размер страницы (обычно 4 КБ). Хотя некоторые драйверы имеют оптимизацию, чтобы попытаться обнаружить большие размеры страниц внутри, если память пользовательского пространства выровнена таким образом.

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