内存导入概述

UMQ 的多内存池导入协议允许一个连接导入多个远端内存池,支持动态扩展。


初始化交换

flowchart TB N0[UMQ_QBUF_DEFAULT_MEMPOOL_ID] N1[queue, OFFSET_FLOW_CONTROL] N2[queue, OFFSET_MEM_IMPORT]

多内存池导入

// umq_ub.c: umq_ub_data_plan_import_mem()
int umq_ub_data_plan_import_mem(uint64_t umqh_tp, umq_buf_t *rx_buf, uint32_t ref_seg_num) {
    // 1. 解析接收缓冲区头部的 umq_imm_head
    umq_imm_head_t *umq_imm_head = (umq_imm_head_t *)rx_buf->buf_data;

    // 2. 解析 import_mempool_info 数组
    ub_import_mempool_info_t *import_mempool_info =
        (ub_import_mempool_info_t *)(rx_buf->buf_data + sizeof(umq_imm_head_t) + ref_seg_num * sizeof(ub_ref_sge_t));

    // 3. 逐个导入内存池
    for (uint32_t i = 0; i < umq_imm_head->mempool_num; i++) {
        // 检查是否已导入
        if (queue->imported_tseg_list[import_mempool_info[i].mempool_id] != NULL) {
            umq_ub_import_mem_done(queue, import_mempool_info[i].mempool_id);
            continue;
        }

        // 导入内存
        xchg_mem_info_t mem_info = { ... };
        imported_tseg = import_mem(queue->dev_ctx->urma_ctx, &mem_info);

        // 发送 IMPORT_DONE 确认
        umq_ub_import_mem_done(queue, import_mempool_info[i].mempool_id);
        //    └─ umq_ub_write_imm(IMM_TYPE_MEM_IMPORT_DONE)
    }
}

内存查找路径

发送数据时,根据 mempool_id 查找已导入的远端内存:

flowchart TB N0[mempool_id]

EID 管理

flowchart TB N0[1024] N1[255] N2[eid_id] N3[tseg_id]