内存导入概述
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]