ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

RDMA-HCA-Mellanox网卡架构与初始化 (一)

RDMA-HCA-Mellanox网卡架构与初始化 (一) HCA 将连接状态、队列配置、地址转换和事件路由组织为硬件对象。设备通过命令接口建立这些对象再根据内存中的描述符和 UAR 门铃执行工作。本篇从对象与内存关系出发解释设备如何启动、取得运行所需的内存、执行管理命令以及满足什么条件后可以关闭和回收资源。1. 整体架构1.1 HCA 功能HCA 是具备 RDMA 传输、DMA 和访问保护资源的网络适配器。对一次 RDMA 操作设备需要识别目标取得工作描述符检查内存访问权限将业务地址转换为设备可访问地址执行网络传输并按配置生成完成记录或事件。发送与接收两端分别执行本端的访问检查和资源管理。下图按接口作用区分命令配置、工作执行和结果报告。图中的处理单元表示软件可见的逻辑职责内部流水线、缓存数量和调度器实现由具体设备决定。HCA 能够直接访问已经建立 DMA 映射的主机内存。正常发送、接收和 CQ 轮询可以通过已映射队列与 UAR 完成受保护对象的创建、设备初始化和异常事件处理仍需要系统软件参与。1.2 软硬件接口1.2.1 控制接口Command Queue 传递设备管理命令。输入包含操作码、上下文参数和页面地址输出包含执行状态、对象编号或查询结果。CREATE_QP、CREATE_CQ 和 CREATE_MKEY 等命令建立不同的对象。控制命令具有独立的所有权和完成机制。一个 CREATE_QP 命令成功只能说明对应 QP 已建立该 QP 能否传输还取决于状态、路径及所引用资源的配置。1.2.2 数据接口SQ、RQ 和 SRQ 保存 WQE。HCA 根据 QPC/SRQC、队列页面映射和发布计数器取得 WQE再使用其中的操作码、地址、Key 和长度执行工作。软件发布 SQ WQE 时更新发送 DBR并通过 Send Doorbell 或 BlueFlame 通知设备。软件发布 RQSRQ WQE 时更新接收 DBRHCA 在入站请求需要接收资源时取得已发布的 WQE普通接收不需要额外写入 UAR Doorbell。WQE 是设备工作描述符业务数据可以位于其引用的缓冲区也可以作为 Inline 数据放在 WQE 内。接收缓冲区的位置由接收 WQE 或 RDMA 请求指定取决于具体操作。1.2.3 事件接口工作完成时HCA 先将 CQE 写入 CQ。CQ 满足通知条件时HCA 再向目标 EQ 写入携带 CQN 的 Completion EQEEQ 满足中断条件时HCA 通过 MSI-X 通知 CPU。中断处理程序消费 EQE、定位软件 CQ 对象并通知上层上层再读取 CQE 获得完成结果。持续轮询 CQ 时可以直接处理 CQE无需为每次完成生成 EQE 和中断。EQ 将多个 CQ 的完成通知与命令、页面请求和设备异常等事件汇聚到有限的 MSI-X 通道使软件可以批量处理事件并控制中断频率。一个 CQ 在同一时刻配置一个目标 EQ多个 CQ 可以共享同一 EQ多个 EQ 也可以共享一个 MSI-X entry。CQE、EQE 与 MSI-X 不必一一对应。结果载体所描述的结果主要识别信息Command Entry 与输出数据管理命令传递及执行结果槽位、Token、status、syndromeCQE工作请求的完成结果WQE 标识、操作类型、长度、错误信息EQE需要通知软件的事件事件类型、CQN/QPN 等相关标识下图展示 WQ、CQ、EQ 与 MSI-X 的汇聚关系。1.3 对象关系一个 QPC 对应一个 QP。通常的 QP 配有一个 SQ 和一个私有 RQ“私有”表示该 RQ 由单个 QP 专用使各 QP 独立管理接收资源。使用共享接收时QPC 通过 SRQN 关联 SRQ多个 QP 共用其中的接收 WQE。QPC 中记录的是队列参数和关联信息WQE 位于单独的队列缓冲区。对象标识主要关联HCA 的访问入口QPQPNSQ/RQ、PD、发送/接收 CQN、UAR、SRQ发送门铃或入站报文SRQSRQN接收 WQE 池、PD、DBRQPC 的接收资源关联CQCQNCQ 缓冲区、DBR、EQN工作完成时由队列配置选择EQEQNEQ 缓冲区、事件映射、MSI-X设备事件路由MKeyIndex 与 Key 部分MKC、转换表、PD、地址范围WQE 的 lkey 或请求的 rkey多个 QP 可以引用同一个 CQ多个 CQ 可以将通知发送到同一个 EQ。对象引用决定创建和销毁依赖被引用的对象需要先存在释放时需要先解除依赖。1.4 内存与地址HCA 使用的主机内存分为专供设备使用的 ICM、双方按协议访问的队列/DBR以及业务数据缓冲区。UAR 则属于 PCI 地址空间通过 CPU MMIO 访问。下图展示三类存储位置。软件交给 HCA 的地址需要在设备发起访问的整个期间保持有效。地址或标识用途CPU 虚拟地址软件访问主机内存或 BAR 映射DMA 地址HCA 发起主机接口访问有 IOMMU 时可以是 IOVAHCA 虚拟地址与 lkey/rkey 一起接受 MKC 范围与权限检查对象编号HCA 查找上下文不能当作 CPU 指针BAR 偏移在对应设备地址窗口内定位寄存器队列页面 PAS 与业务内存 MKey/MTT 分别配置。HCA 找到 WQE 的过程和根据 WQE 找到业务数据的过程使用不同的映射详见《RDMA-HCA-Mellanox网卡队列 (三)》与《RDMA-HCA-Mellanox网卡地址转换与保护 (四)》。2. 硬件资源2.1 上下文与队列Context包括 QPC、SRQC、CQC、EQC 和 MKC 等对象上下文保存对象的配置、关联和运行状态Queue Buffer包括存放 WQE 的 SQ、RQ 和 SRQ存放 CQE 的 CQ以及存放 EQE 的 EQ保存实际描述符。对象建立时软件通过命令提供软件可见字段及页面列表HCA 管理内部对象。查询命令返回的上下文布局是接口格式并不直接暴露设备内部 ICM 的存储地址。一个对象内部可能同时存在软件配置字段、设备维护的运行状态和保留字段。修改范围由命令及对象状态决定查询获得的状态快照也不等同于暂停对象执行。2.2 容量与限制2.2.1 上下文大小Entry size 描述单个 ICM 条目的资源开销。下表是手册给出的资源估算值实际条目大小取决于设备配置应结合设备查询结果确定。命令中的 Context 格式长度、ICM 条目大小和实际队列缓冲区大小各有用途内存估算需要分别计算。对象单个 ICM 条目的开销表列对象数量上限队列规模或映射规模QPC256 B16MSQ 按 WQEBB 计数RQ 按 WQE stride 组织SRQC32 B16MWQE 数量与每个 WQE 的 strideCQC64 B16M2^log_cq_size个硬件槽位EQC64 B5122^log_eq_size个 EQEMemory Key Context128 B16M地址范围与转换条目数MTTKLM8 B16 B表列 unlimited取决于映射页数或间接条目数例如表列 QPC 的 ICM 开销为 256 B而软件可见 QPC 格式覆盖到 0xE7其差异不表示剩余字节可由软件作为私有数据使用。MTT/KLM 的表列 unlimited 表示该资源表未给定固定条目上限实际数量仍受设备能力和可供页面约束。2.2.2 对象数量Max entries supported per virtual HCA 是对象数量的规格上限。实际可配置或可分配数量还取决于 QUERY_HCA_CAP 返回值、预留对象、已占用资源以及页面供给。一个 CQC 对应一个 CQ不能将 CQC 的对象数当作某个 CQ 的槽位数。对象编号允许存在空洞。即使知道条目大小也不能据此构造可由主机直接访问的ICM_base object_id × entry_size地址设备只承诺通过相应对象标识和命令访问这些资源。2.2.3 队列深度队列深度来自该对象的上下文参数。CQ/EQ 的槽位数分别为2^log_cq_size、2^log_eq_sizeSQ 的规模按 64 B WQEBB 计量一个 WQE 可以占用多个 WQEBBRQ/SRQ 的容量同时涉及槽数和 stride。软件能够同时提交的 WR 数还受最大 WQE 大小、预留槽及资源回收方式影响。硬件槽数、Buffer 字节数和可挂起 WR 数应分别表达。2.3 ICM 管理ICM 是交给 HCA 专用的固定主机页面用于设备运行和 Context 管理。页面交接后软件保留分配记录和 DMA 映射但不得读写页面内容内部布局由 HCA 管理。对象销毁通常只改变设备内部资源占用页面何时可以回收由页面交接协议决定。页面需求按 Function 关联。设备向可信 PF 软件请求页面相关 VF 的需求由可信管理侧承接。这种关联保证设备内部资源有可追踪的归属并支持 Function 的独立初始化和关闭。2.4 页面供给与回收设备通过 QUERY_PAGES 返回值或 Pages Request EQE 告知页面需求。QUERY_PAGES 返回指定 Function 当前需要补充或可以归还的聚合 ICM 页面数量这些页面主要承载 Firmware 管理的对象 Context 和内部状态不包含 WQE、CQE、EQE 等 Queue Buffer。MANAGE_PAGES 将 DMA 页地址交给设备或取得设备归还的页地址。软件应按命令实际成功接收、实际归还的清单更新记账。下面的时序图展示页面从软件可用、设备专用到归还后的状态变化。运行期 Pages Request 事件同样通过 MANAGE_PAGES 响应。每个 Pages Request 事件至少需要一次 MANAGE_PAGES 响应。在获得响应前同一function_id不会再次发送页面请求事件其他 Function 的事件不受这项等待约束。无法提供页面时也需要使用相应模式报告分配失败使等待资源的命令能够以资源不足结束。回收命令可能需要重复执行直到设备不再返回页面。页面需求通知并不直接解除 DMA 映射实际归还结果才是软件恢复页面使用权的依据。2.5 资源隔离Function、PD 和 UAR 分别承担不同层面的资源关联。Function 管理命令接口和所属设备资源PD 用于 QP 与内存对象之间的保护检查UAR 为直接提交工作的执行主体提供 MMIO 入口。机制约束对象配置含义Function 归属命令、上下文和 ICM限定对象管理的设备实例PDQP、SRQ、MKey 等限定可组合使用的通信和内存资源UAR 关联发送与完成通知入口指定相应队列使用的用户访问区域MKey 权限本地/远端内存访问检查 Key、范围和操作许可这些配置需要一起满足。例如一个有效的 rkey 仍需通过目标 QP、PD、权限及地址范围等适用检查才能形成数据访问。3. 初始化3.1 启动与就绪复位解除后设备从 Flash 加载 Firmware并检查读取内容的签名。完成内部加载后设备可以响应 PCI 枚举。平台分配 BAR 后CPU 可以访问位于 PCIe BAR0 起始位置的 Initialization Segment MMIO 寄存器区域其详细布局和位域含义见第 5 节“寄存器与查询”。设备执行命令和 DMA 前PCI Bus Master 必须已启用。PCI 枚举完成、initializing0和 INIT_HCA 成功分别表示不同阶段地址入口可用、命令接口可接收工作、HCA 运行资源初始化完成。3.2 命令接口建立Command Queue 位于 4 KiB 大小且 4 KiB 对齐的物理连续内存块。软件从 Initialization Segment 读取队列的槽位数和 stride分配并映射队列再将设备可使用的地址写入 Initialization Segment相关寄存器字段见第 5 节“寄存器与查询”。使用两个 32 bit MMIO 写地址时先写高位再写低位。低位所在 DWORD 同时包含nic_interface完整 HCA 驱动启动时该字段选择 full_driver写入时其余要求清零的位保持零。随后轮询initializing设备就绪后才开始命令交互。下面的 UML 图展示启动依赖。图中相邻的依赖命令都需要等待前一命令成功Boot Pages、Init Pages 与运行期页面需求分阶段处理。3.3 ISSI 选择ENABLE_HCA 使 Function 进入允许后续初始化的状态。QUERY_ISSI 返回接口支持信息SET_ISSI 选择双方共同支持的接口语义使后续命令按照该接口定义解释。ISSI 与 Firmware 版本号、Command Interface revision 各有职责。软件需要识别命令传输接口并选择有效的 ISSI设备返回不支持时应停止依赖该接口的初始化避免继续提交字段含义不匹配的命令。3.4 能力查询与配置QUERY_HCA_CAP 用于读取设备能力和资源限制SET_HCA_CAP 设置允许由软件选择的系统参数。能力值决定可创建的对象规模、允许的页面粒度和可使用的功能对象创建命令仍会校验具体请求。能力类别影响对象数量QP、CQ、SRQ、MKey 等资源规模队列参数最大队列深度、WQE/CQE 相关限制地址与页面页面大小、转换方式、内存访问能力传输能力传输类型、READ/Atomic 等操作支持接口功能BlueFlame、Fast Teardown 等可选机制能力选择位于 INIT_HCA 之前设备已经运行后修改对象的参数应使用对应命令和允许的状态转换不能把 SET_HCA_CAP 当作任意运行参数更新接口。3.5 页面准备Boot Pages 支持设备启动阶段的内部资源Init Pages 满足 HCA 初始化和后续命令所需的页面要求。QUERY_PAGES 在相应阶段返回数量MANAGE_PAGES 可以分批提供。设备允许的情况下也可以预先提供 Boot Pages 与 Init Pages 的总和。若 Init Pages 需求为零可以跳过该阶段的页面提供需求非零时应完成页面交接后再执行依赖它的 INIT_HCA。所有已交接页面都必须保留记录以便失败处理和正常关闭时逐一收回。3.6 HCA 激活INIT_HCA 使用已经选定的能力配置和已交接页面建立运行环境。命令成功后可以创建 EQ 和后续数据对象。该成功结果并不替代各 QP 的状态转换也不说明物理链路和对端连接已经准备完毕。软件需要逐步区分三项条件Function 已启用、HCA 已初始化、数据对象已具备执行条件。这样才能判断某项失败应回退到哪个已完成阶段。3.7 事件与端口准备EQ 建立后页面请求和命令完成等事件可以使用事件通道。把 EQ 映射到命令完成通道的 CREATE_EQ 必须在命令队列为空时单独执行切换期间不能并发提交其他命令。EQ 尚未建立时通过 Command Entry ownership 轮询完成。物理端口由端口管理寄存器配置vport 命令用于查询和设置 Function 对应的逻辑端口状态、地址等信息。端口链路、vport 状态和 QP 传输状态需要分别满足条件。RoCE 需要有效的 Ethernet 地址与路径配置InfiniBand 还涉及相应管理与路径信息。4. 命令机制4.1 命令队列布局Command Queue 是固定步长条目数组。槽位数N2^log_cmdq_size步长T2^log_cmdq_stride本手册所述当前布局为 32 个槽位、64 B stride队列驻留于前述 4 KiB 内存块。设备从 Initialization Segment 获取队列地址。命令槽 i 的地址为cmdq_dma_base i × T。这是软件可见的命令队列数组寻址上下文内部 ICM 的寻址不由此公式推导。输入和输出各有独立的 Mailbox 链。下图把命令队列、槽位和两条 Mailbox 链放在同一布局中。箭头表示地址引用槽位与链表数量不代表命令执行先后。4.2 命令描述符一个 Command Entry 同时容纳请求和响应的前 16 B。input_length与output_length按完整逻辑消息计数超出 16 B 的部分分别位于输入和输出 Mailbox。下图显示描述符的字节区间及 Mailbox 控制尾部。表中的偏移均相对各自结构起点。Entry 偏移位域字段含义与访问方0x00[31:24]type软件置0x7选择 PCIe Command Transport0x04[31:0]input_length软件填写完整命令输入字节数0x080x0C[31:0][31:9]input_mailbox_pointer输入 Mailbox 地址的高位有效低位0x10–0x1F128 bitcommand_input_inline_data软件填写输入头 16 B0x20–0x2F128 bitcommand_output_inline_data设备写入输出头 16 B0x300x34[31:0][31:9]output_mailbox_pointer软件提供输出 Mailbox 地址0x38[31:0]output_length软件提供输出空间长度0x3C[31:24]token软件设置与该命令 Mailbox 的 token 一致0x3C[23:16]signatureCommand Entry 校验值0x3C[7:1]status软件提交时清零设备返回传递状态0x3C[0]ownership软件提交置 1设备完成清零命令消息头与上述传输描述符是两层结构。消息头决定实际要执行的 HCA 操作。消息偏移位域字段含义输入0x0031:16opcode管理操作码输入0x0415:0op_mod操作修饰未定义时为零输入0x08 起按命令定义command对象配置或查询参数输出0x0031:24status命令执行状态输出0x0431:0syndrome进一步的错误信息输出0x08 起按命令定义response对象编号、查询内容等4.3 Mailbox 布局每个 Mailbox 的数据区为 512 B后面附带保留区、链指针、块编号和校验字段。有效描述范围到 0x23F链指针的有效低位要求下一块按 1024 B 对齐。描述范围长度和块起点对齐分别满足要求。Mailbox 偏移位域字段含义0x000–0x1FF512 Bmailbox_data超过 Entry inline 部分的命令数据0x200–0x22F48 BReserved软件清零0x2300x234[31:0][31:10]next_pointer下一个 Mailbox 地址链尾为零0x238[31:0]block_number从零递增的块编号0x23C[23:16]token与 Command Entry 匹配0x23C[15:8][7:0]ctrl_signaturesignature控制区及整个块的校验值当逻辑消息长于 16 B 时所需数据块数为ceil((length−16)/512)。例如长度 1040 B 的消息由 Entry 内 16 B 和两个各含 512 B 数据的 Mailbox 组成。输入和输出按各自长度独立计算不要求使用相同数量的块。Block number 从零连续递增所有块的 Token 与命令一致末块 next_pointer 为零。HCA 通过指针、块号与 Token 检查链条是否属于当前命令。启用签名检查时输入数据和输出链控制信息都需要符合校验规则设备输出的签名用于检查写回结果。4.4 所有权与 Token软件准备槽位时拥有其内容。提交时把 ownership 置 1并在通知设备前保证相关内存写入可见HCA 完成后将其清零。设备持有所有权期间软件必须保持 Entry、Mailbox 和所引用的命令缓冲区有效。Token 是命令与 Mailbox 的关联字段能够识别链条和请求代次它不代表对象编号也不允许绕过所有权直接复用仍在执行的槽位。槽位只有在确认对应操作完成、读取结果并完成本地处理后才可重新提交。4.5 提交与执行command_doorbell_vector是槽位位图。写入 bit i 表示槽 i 有新命令一次 MMIO 写可以同时提交多个槽。HCA 取得相应 Entry 和输入链执行命令再写入输出和状态。下面的时序图将写描述符、发布、设备执行和读取结果连起来。读写屏障分别保证设备能看到输入、软件能看到完成后的输出。命令可以乱序执行和完成。创建 CQ 与随后引用其 CQN 的 CREATE_QP 存在依赖必须等待前者成功把两者同时置入 Doorbell 位图不能建立依赖顺序。互不依赖的命令才有条件使用多个槽位并发。4.6 完成通知HCA 写回结果并归还 ownership 后软件可以通过轮询发现完成也可以通过 Command Completion EQE 的完成位图定位相关槽位。事件位图可同时指示多个自前次事件以来完成的命令。事件用于发现结果最终仍需检查对应 Entry 的状态和输出。开启事件完成后EQ 必须持续保有可用空间若 EQ 没有空间软件需要先推进其 Consumer再继续提交依赖该完成通道的命令。命令 EQ 的建立和映射必须使用前面描述的独占切换条件。轮询阶段与事件阶段都使用相同的 Command Entry变化的是完成发现方式。4.7 错误与超时错误分为传递错误和命令执行错误。传递层检查 Entry 与 Mailbox 的格式、Token、链条和长度执行层检查对象、状态、参数与资源条件。层次代表错误处理时关注的内容Entry statusSIGNATURE_ERR、TOKEN_ERR输入与链控制信息是否匹配Entry statusBAD_BLOCK_NUMBER、BAD_INPUT_POINTER块顺序与地址对齐Entry statusINPUT_LEN_ERR、OUTPUT_LEN_ERR消息长度及输出空间Entry statusRESERVED_NOT_ZERO保留字段初始化输出 status/syndrome参数、状态、权限或资源错误对应命令语义和对象状态设备命令接口未给出统一的硬件命令超时值软件可以对提交计时。超时只说明在规定时间内没有观察到完成不能证明 HCA 已停止 DMA也不能据此立即释放 Mailbox。后续必须通过健康检查、已定义的关闭或复位机制确认设备访问结束。5. 寄存器与查询5.1 BAR 布局HCA BAR 提供 Initialization Segment 和 UAR 等窗口。Initialization Segment 位于 BAR 起始位置UAR 的定位使用相应分区和编号规则详见《RDMA-HCA-Mellanox网卡UAR与门铃 (二)》。下图强调直接 MMIO 寄存器与命令访问的管理寄存器之间的关系。ACCESS_REGISTER 的 register ID 是命令字段不能直接用作 BAR 偏移。5.2 初始化寄存器下表汇总直接参与启动、命令与状态读取的 Initialization Segment 字段。所有偏移相对 Segment 起点。偏移位域字段访问用途0x000[31:16][15:0]fw_rev_minorfw_rev_majorROFirmware 版本0x004[31:16][15:0]cmd_interface_revfw_rev_subminorROCommand Interface 和补丁版本0x010[31:0]cmdq_phy_addr[63:32]RWCommand Queue 地址高位0x014[31:12]cmdq_phy_addr[31:12]RWCommand Queue 地址低位0x014[10:8]nic_interfaceRWFull Driver、Disabled 等接口状态0x014[7:4][3:0]log_cmdq_sizelog_cmdq_strideRO槽位数stride 的 log2 值0x018[31:0]command_doorbell_vectorWO提交一个或多个命令槽位0x1FC[31]initializingRO为零时设备可以接收命令0x1FC[19:16]initializing_stateRO初始化中的等待中止状态0x200–0x23F64 Bhealth_buffer表列 RW设备健康诊断信息0x1000–0x100764 bitinternal_timerRO设备内部计时值0x100C[0]clear_intWO写 1 清除 Legacy Interrupt0x1010[31:24][23:0]health_syndromehealth_counterRO健康错误和活动计数5.3 命令寄存器cmdq_phy_addr指定命令队列基址log_cmdq_size和log_cmdq_stride描述其几何尺寸command_doorbell_vector通知各槽位。队列地址从 INIT_HCA 到 TEARDOWN_HCA 之间保持不变。nic_interface与命令地址低位共用 DWORD。写该寄存器时必须保留需要保持的地址位并按操作要求设置接口状态。full_driver、disabled 和 reset 等状态具有不同效果PF reset 可以影响整个设备的其他 Function不能将其理解为单个普通队列的复位。5.4 状态与健康信息Firmware 版本字段和命令接口 revision 用于识别设备当前接口。health_counter表示设备健康活动计数health_syndrome表示设备报告的健康错误health_buffer提供更详细的诊断内容。一次读取到计数器不变不能单独证明设备失活应结合持续观察、syndrome 和命令状态分析。健康缓冲区是诊断接口即使表列访问属性为 RW也不应把它作为业务缓冲区写入。5.5 设备计时器internal_timer返回设备内部时间可用于解释支持时间戳的 CQE。原始计时值与系统墙钟时间之间需要设备规定的频率、格式和换算关系不能直接将其当作纳秒或 CPU 时钟。计时器为 64 bit。若平台不能以一致方式读取整个值需要采取能检测高位变化的读取方式避免低位回绕造成拼接结果错误。该一致性处理只服务于读数不会建立 RDMA 数据访问的先后顺序。5.6 ACCESS_REGACCESS_REGISTER 将 register ID、访问方法和寄存器载荷封装为管理命令用于物理端口状态、链路参数、计数等管理信息。寄存器载荷按该寄存器自己的位域定义解释。查询入口获得的信息QUERY_HCA_CAP对象数量、队列能力和支持功能QUERY_ADAPTERAdapter 标识等设备信息QUERY_QP/CQ/EQ/MKEY已创建对象的配置或运行快照QUERY_VPORT_STATE逻辑端口状态ACCESS_REGISTER指定管理寄存器的内容直接寄存器读取、对象查询和能力查询解决不同的问题。实际队列深度应查询对象配置设备能够支持的最大深度应读取能力两者不能互相替代。5.7 ICMD 接口ICMD 提供通过 PCI VSC Gateway 访问的工具侧命令入口。它具有独立的 Control、Mailbox Size、Syndrome 和 Mailbox 配置空间常规 HCA 数据工作仍通过 WQE 执行。ICMD 地址字段作用0x000000Controlopcode、status、exmb、busy0x001000Mailbox SizeMailbox 容量信息0x001008Syndrome进一步的结果信息0x100000 起Mailbox命令参数与结果Control 的opcode[31:16]指定操作status[15:8]返回状态exmb[1]指定外部 Mailbox 方式busy[0]表示启动与执行状态。软件需先取得 Gateway 所有权访问结束后归还避免不同访问者交叉修改地址和数据寄存器。普通内部 Mailbox 路径选择exmb0先按 Mailbox Size 清零整个 Mailbox再填写输入启动时写 opcode、清 status、置 busy。外部 Mailbox 需要icmd_exmb能力和有效的 MKey 配置取得 Gateway 所有权后重新配置该 Key。下面的 UML 图展示内部 Mailbox 的访问顺序。Gateway 访问成功和内部命令执行成功需要分别检查。6. 关闭与恢复6.1 资源释放条件释放硬件可访问的内存必须满足相关工作不再产生新访问、已提交访问已处理、对象引用已解除等条件。停止软件提交只能阻止新增工作已经交给 HCA 的 WQE 和远端仍可发起的请求还需单独处理。关闭 Function 前应停止业务并销毁所属资源。QP、CQ、MKey 和共享接收资源之间的依赖决定释放次序先停止新增工作并处理在途访问再解除对象引用最后释放底层页面与映射。6.2 HCA 关闭正常关闭在数据对象停止后解除页面请求事件映射并销毁 EQ再执行 TEARDOWN_HCA。硬件确认成功后不再代表该 ICM 发起 PCI 访问此时可以继续按页面回收协议完成清理。下图展示正常关闭的关键确认点。关闭 PF 时其相关 VF 也受影响需要先处理这些 Function 的工作。6.3 页面归还正常路径通过 MANAGE_PAGES 循环取得归还清单直到相关页面全部回收。软件根据返回地址找到原分配记录解除映射并释放。设备确认关闭与软件完成页面记账是两个相关但不同的动作。最后执行 DISABLE_HCA结束该 Function 的启用状态。若关闭命令失败不能套用成功路径直接释放仍可能被 HCA 使用的页面。6.4 Fast Teardown设备能力fast_teardown1时可以请求TEARDOWN_HCA(profileprepare_fast_teardown)。结果state0表示准备成功随后将 Initialization Segment 的 nic_interface 设置为 disabled并轮询确认该状态。结果state1时使用正常关闭流程。该机制缩短逐页归还所需的关闭过程其可用性和完成确认都来自设备协议。只有看到相应关闭状态软件才可以根据已记录页面执行释放不能仅因准备命令已提交就撤销内存。下面的 UML 图展示准备成功的路径准备失败时转入上一节的正常关闭时序。6.5 失败与重新初始化初始化失败时要保留已完成阶段的记录命令队列是否已建立、Function 是否已启用、哪些 ICM 页面已交接、INIT_HCA 是否成功、哪些对象和 EQ 已创建。清理只针对已成功取得的资源DMA 页面仍按设备确认的生命周期释放。失败位置后续重点接口尚未就绪读取初始化状态停止提交后续命令页面提供失败报告资源不足核对已接收页面INIT_HCA 或对象创建失败按已建立资源解除依赖并执行适用关闭流程命令超时或设备异常先确认设备访问状态再决定页面回收重新初始化需要重新建立有效的队列地址、能力选择、页面和对象关联。旧对象编号、旧队列状态及旧 Key 不能假定在重新初始化后仍然有效。7. 总结HCA 的管理入口是 Command Queue运行资源由 ICM 页面和各类对象构成数据入口则是队列缓冲区与 UAR。对象编号连接各类上下文页面映射连接硬件对象和实际存储。初始化的关键依赖是命令通道、接口选择、页面供给和 HCA 激活。命令描述符通过所有权交接多个槽位允许并发存在依赖的命令仍需等待成功结果。关闭时设备确认、页面归还和软件解除映射共同完成资源回收。8. 参考资料Mellanox Adapters Programmer’s Reference ManualRev 0.53。Linux 本地 mlx5 命令和页面管理实现linux/drivers/net/ethernet/mellanox/mlx5/core/cmd.c、linux/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c。
返回列表