На примере libfabric стек вызовов выглядит следующим образом:
ibv_reg_mr -> NA_Mem_register -> na_ofi_mem_register -> fi_mr_regv -> ibv_reg_mr
Регистрация памяти
struct ibv_mr *ibv_reg_mr
__ibv_reg_mr
enum ib_uverbs_access_flags
IB_UVERBS_ACCESS_OPTIONAL_RANGE
ibv_reg_mr_iova2 -> глаголы: слабо отсортированные области памяти, добавьте флаг, разрешающий создание слабо отсортированных областей памяти. через этот класс MR доступ можно улучшить, разрешив системе изменять порядок определенных доступов. производительность。 Поскольку расслабленная сортировка является оптимизацией, драйверы, которые ее не поддерживают, могут ее просто игнорировать. Необязательный MR Доступный битовый диапазон определяется в соответствии с разделом соответствия ядра, и его первая запись будет иметь вид IBV_ACCESS_RELAXED_ORDERING。 Если приложение использует бит из необязательного диапазона, библиотека маскирует его на случай, если ядро не поддерживает «MR». Дополнительный режим».
reg_mr -> mlx5_vfio_reg_mr
.reg_mr = mlx5_reg_mr,
...
execute_cmd_write(pd->context, IB_USER_VERBS_CMD_REG_MR, cmd, -> ib_uverbs_reg_mr
В качестве примера возьмем драйвер Intel E810:
ibv_reg_mr:
IB_USER_VERBS_CMD_REG_MR
ib_uverbs_reg_mr -> .reg_user_mr = irdma_reg_user_mr
region = ib_umem_get -> закрепленная и пользовательская память, отображаемая через DMA, IB/глаголы: будет ib_umem_get()/ib_umem_release() экспорт в модуль, экспорт ib_umem_get()/ib_umem_release() и позвольте низкоуровневому драйверу контролировать, когда звонить ib_umem_get() Приходите и прикрепите DMA Сопоставить пользовательское пространство вместо того, чтобы всегда его вызывать При вызове драйвера низкого уровня reg_user_mr метод раньше ib_uverbs_reg_mr() середина. Также переместите эти функции в ib_core модуль вместо ib_uverbs in, чтобы модули драйверов, которые их используют, не зависели от ib_uverbs。 Это имеет много преимуществ: - Это лучший дизайн с точки зрения превращения общего кода в библиотеку, которую можно использовать или переопределять кодом, специфичным для устройства, в соответствии с деталями конкретного устройства. - Драйверам, которым не требуются закрепленные области памяти пользовательского пространства, не нужно переносить вызовы. ib_mem_get() потеря производительности. Например, хотя я и не пытался реализовать это в этом патче, ipath Драйверы должны иметь возможность избегать закрепленной памяти и использовать только copy_{to,from}_user() для доступа к областям памяти пользовательского пространства. - Буферы, требующие специальной обработки сопоставления, могут быть идентифицированы драйверами низкого уровня. Например, используя дополнительное сопоставление флагов CQ Буфер, может решить проблему в пользовательском пространстве mthca CQ некоторые специфические для Altix проблема с сортировкой памяти. - Необходимо исправить сумму для содержимого за пределами области памяти. DMA Драйверы, отображающие память пользовательского пространства, можно использовать напрямую. ib_umem_get() вместо использования его reg_phys_mr Дополнительные параметры метода можно взломать. Например, объединиться mlx4 Драйверу требуются булавки и DMA картографирование QP и CQ буферы, но для этих буферов нет необходимости создавать ключи памяти. Итак, самое чистое решение mlx4 существовать create_qp и create_cq Вызывается в методе ib_umem_get() -> вызов ib_umem_get Завершение операции закрепления страницы памяти + Организация закрепленных страниц памяти в DMA SG List
can_do_mlock -> [PATCH] IB uverbs: реализация закрепления памяти (pin), добавляет поддержку закрепления области памяти пользовательского пространства и возврата списка страниц в этой области. Это включает в себя на основе vm_locked Отслеживайте закрепленную память и не допускайте превышения непривилегированными пользователями RLIMIT_MEMLOCK
mmgrab(mm) -> Захватить память (цитата +1)
__get_free_page
npages = ib_umem_num_pages(umem)
ib_umem_num_dma_blocks(umem, PAGE_SIZE) -> RDMA/Я знаю: Воля ib_umem_num_pages() Разделить на ib_umem_num_dma_blocks(),ib_umem_num_pages() Только путем прямого существования CPU Используется на странице SGL вещи для использования. Строить DMA Список драйверов, которым следует использовать новую ib_num_dma_blocks(), который возвращает rdma_umem_for_each_block() Количество фрагментов, которые будут возвращены. сделать DMA Драйверы являются общими и требуют различных реализаций. Только если запрошенный размер страницы < PAGE_SIZE и/или IOVA == umem->address когда, исходя из umem->address вычислить DMA Количество блоков допустимо. Напротив, ДМА Количество страниц должно бытьсуществовать IOVA адресв космосевычислить,вместо umem->address。 Таким образом, ИОВА Должен хранить существование umem Внутри,чтобы его можно было использовать для этихвычислить。 Сейчас существуют, по умолчанию установлено значение umem->address исуществоватьвызов ib_umem_find_best_pgsz() пора это исправить. Это позволяет водителю безопасно перейти в ib_umem_num_dma_blocks()
cond_resched -> RDMA/umem:существовать ib_umem_get() Добавьте пункт отправки в,картографированиетакой маленький, как 64GB может понадобиться 10 Более секунды, триггер CONFIG_PREEMPT_NONE=y проблема с ядром. ib_umem_get() ужесуществовать x86_64 выше 2MB Разделите работу на блоки,существование Добавлено в постоянный цикл cond_resched() достаточно, чтобы решить проблему. Обратите внимание, что sg_alloc_table() Все еще можно использовать более 100 Миллисекунды, это тоже проблематично. Это может произойти позже. ib_umem_add_sg_table() решить в,по требованиюсуществовать sql Добавьте новый блок в . существовать Некоторая трудоемкая обработка, такая как файловая системаи Внутри Некоторые пути для хранения и восстановления будутвызовcond_resched, Используйте cond_resched, чтобы проверить, есть ли возможность планирования. Для непревентивного Внутри В ядерном плане,существовать Внутри Многие места в ядерной,Особенно операции с файловой системойи Внутри В некоторых трудоемких путях, связанных с управлением хранилищем,были идентифицированы разработчиками ядра,иделатьиспользоватьcond_reschedчтобы уменьшить задержку, cond_resched() функция, ее функция — упреждающее делегирование полномочий и ожидание следующего запланированного запуска. ссылка: https://www.zhihu.com/question/35004859
pin_user_pages_fast
sg_alloc_append_table_from_pages
ib_dma_map_sgtable_attrs
ib_copy_from_udata(&req, udata, min(sizeof(req), udata->inlen)
irdma_alloc_iwmr
ib_umem_find_best_pgsz
ib_umem_num_dma_blocks
case IRDMA_MEMREG_TYPE_QP
irdma_reg_user_mr_type_qp(req, udata, iwmr)
irdma_handle_q_mem(iwdev, &req, iwpbl, lvl)
irdma_setup_pbles -> Скопируйте страницу пользователя в PBLE
case IRDMA_MEMREG_TYPE_QP
irdma_check_mem_contiguous
rdma_udata_to_drv_context
list_add_tail(&iwpbl->list, &ucontext->qp_reg_mem_list)
case IRDMA_MEMREG_TYPE_MEM
irdma_reg_user_mr_type_mem
irdma_setup_pbles -> Использовать реконструкцию битовой маски PBLE функция для представления требуемого PBLE уровень, при использовании 2 параметры use_pble и lvl_one_only Сделайте код загроможденным
HW делатьиспользовать Хозяин Внутри Хранится как несколько объектов контекста протокола.и Резервное хранилище для отслеживания статуса очереди。 Кэш памяти хоста (HMC) отвечает за управление хранилищемсуществовать Хозяин Внутри Компоненты этих объектов в памяти。 Добавляйте функции и структуры данных для управления HMC Выделение страниц поддержки для использования различными объектами, В этой статье в основном анализируются преимущества и недостатки механизма управления контекстной памятью драйвера RDMA, такого как intel/hns3/mlx5 в ядре Linux: https://zhuanlan.zhihu.com/p/610503666, Реализация записей списка физических буферов (PBLE) Менеджер ресурсов для управления PBLE HMC пул объектов ресурсов,
irdma_get_pble ?
get_lvl1_lvl2_pble
get_lvl1_pble
irdma_prm_get_pbles
bitmap_find_next_zero_area
bitmap_set
get_lvl2_pble
...
add_pble_prm -> Host Memory Cache (HMC) Кэш памяти хоста, prm Управление ресурсами страницы
irdma_get_type
add_sd_direct
irdma_add_sd_table_entry
dma_alloc_coherent
memcpy(&sd_entry->u.pd_table.pd_page_addr, &dma_mem,
add_bp_pages -> Добавить страницу внутренней памяти для описания сегмента
irdma_pble_get_paged_mem
irdma_map_vm_page_list
vmalloc_to_page -> найден vmalloc( )Местовыделено Внутрихранимый виртуальныйадрес Местокартографированиефизическая страница,и Возвращает дескриптор указателя страницы
dma_map_page -> Воля一页物理Внутрисохранятькартографирование
irdma_add_sd_table_entry
irdma_add_pd_table_entry
dma_alloc_coherent
memcpy(&pd_entry->bp.addr, page, sizeof(pd_entry->bp.addr))
memcpy(pd_addr, &page_desc, sizeof(*pd_addr))
irdma_invalidate_pf_hmc_pd -> делать PF в аппаратном обеспечении pd Кэш недействителен
writel(val, dev->hw_regs[IRDMA_PFHMC_PDINV])
irdma_prm_add_pble_mem
bitmap_zalloc
irdma_hmc_sd_one
irdma_set_sd_entry
or irdma_clr_sd_entry
dev->cqp->process_cqp_sds(dev, &sdinfo) -> irdma_update_sds_noccq
cqp_sds_wqe_fill
irdma_get_cqp_reg_info
irdma_sc_cqp_post_sq
irdma_cqp_poll_registers
list_add(&chunk->list, &pble_rsrc->pinfo.clist)
get_lvl1_lvl2_pble
irdma_copy_user_pgaddrs -> Изменить адрес страницы пользователя копировать на локальный pble Операционная система
sg_page -> Получите указатель страницы, соответствующий списку разброса.
rdma_umem_for_each_dma_block -> Итерировать umem продолжения DMA кусок
rdma_block_iter_dma_address -> получатькусок Итерировать Ток, проводимыйкусок Выравнивание dma адрес
irdma_next_pbl_addr
irdma_check_mr_contiguous
irdma_check_mem_contiguous
irdma_create_stag -> случайный олень
get_random_bytes
irdma_alloc_rsrc -> RDMA/irdma: зарегистрировать вторичный драйвер и реализовать частный канал. ОП, регистрацию можно пройти по адресу Intel PCI netdev водитель i40e иice Подключиться к вспомогательному RDMA Помощь по оборудованию водитель. Реализация операций частного канала и регистрация сетевых уведомителей.
irdma_hwreg_mr(iwdev, iwmr, access) -> Отправьте команду cqp для регистрации в памяти.
irdma_alloc_and_get_cqp_request
irdma_get_mr_access
cqp_info->cqp_cmd = IRDMA_OP_MR_REG_NON_SHARED -> irdma_sc_mr_reg_non_shared
irdma_sc_cqp_get_next_send_wqe
...
set_64bit_val(wqe, 32, info->reg_addr_pa)
irdma_sc_cqp_post_sq
stag_info->reg_addr_pa = iwmr->pgaddrmem[0]
irdma_handle_cqp_op
irdma_put_cqp_request
UVERBS_OBJECT_MR
ib_check_mr_access
uobj_get_obj_read
reg_user_mr
linux kernel master
блог: https://cloud.tencent.com/developer/user/5060293/articles | https://logread.cn | https://blog.csdn.net/ssbandjl | https://www.zhihu.com/people/ssbandjl/posts