Подробное объяснение RDMA_verbs - анализ исходного кода ibv_reg_mr (зарегистрированная память)
Подробное объяснение RDMA_verbs - анализ исходного кода ibv_reg_mr (зарегистрированная память)

Подробное объяснение RDMA_verbs - анализ исходного кода ibv_reg_mr (зарегистрированная память)

Пользовательский режим

На примере libfabric стек вызовов выглядит следующим образом:

Язык кода:javascript
копировать
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:

Язык кода:javascript
копировать
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

Сяобин (ssbandjl)

блог: https://cloud.tencent.com/developer/user/5060293/articles | https://logread.cn | https://blog.csdn.net/ssbandjl | https://www.zhihu.com/people/ssbandjl/posts

столбец ДПУ

https://cloud.tencent.com/developer/column/101987

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.