Зарегистрировать большой буфер для RDMA в модуле ядра Linux
Я новичок, экспериментирующий с использованием rdma (ib_verbs) в модуле ядра. Я получил пример кода от krping и возился с ним. Система работает на 64-битном Linux Centos с собственным ядром 3.10 Linux, для которого отключены прозрачные огромные страницы. Мне нужно большое (до 4 ГБ) пространство для чтения / записи RDMA, которое не должно быть смежным, поскольку я, скорее всего, буду записывать / читать не более 1 МБ за раз с удаленной стороны (произвольный доступ).
Вопрос:
- Должен ли я просто сделать тысячу раз 4MB kmalloc и зарегистрировать регион DMA? Насколько это плохо, дизайн разумно для выделения большого куска памяти, используя kmalloc вместо vmalloc? Я слышал, что это не должно быть сделано, и большая память должна быть получена только через vmalloc. Но адреса из vmalloc не подходят для DMA.
- Если нет, то что может быть хорошим альтернативным способом иметь буфер 4 ГБ, который может быть произвольным доступом с удаленной стороны?
- Как пользовательская среда rdma управляет этим типом буфера? Я вспомнил, что я только Malloc 4 ГБ памяти и вызова ibv_reg_mr, и он готов к использованию.
1 ответ
Пока вы не используете память, которая покрывает всю физическую память (что не рекомендуется для MR с поддержкой записи), вы должны использовать IB_WR_REG_MR
рабочий запрос для регистрации вашей области памяти. Для этого вы бы использовали ib_map_mr_sg
функция, которая принимает список разброса и размер страницы. Таким образом, в основном, вы можете зарегистрировать MR, который построен с кусками фиксированного размера, которые вы выбираете.
Здесь есть компромисс: использование небольшого размера выделения позволит ядру легче находить свободную память на фрагментированных системах, но, с другой стороны, это может снизить производительность, поскольку это может увеличить нагрузку на IOTLB сетевой карты.
Пространство пользователя обрабатывает большую регистрацию MR, звоня get_user_pages
и используя системный размер страницы (обычно 4 КБ). Хотя некоторые драйверы имеют оптимизацию, чтобы попытаться обнаружить большие размеры страниц внутри, если память пользовательского пространства выровнена таким образом.