RDMA 关键技术研究:Memory Window

最后更新: 2026-04-09, 作者: HAO022

这是一系列的 AI Infra 基础技术研究文章。

概念

  • 基本概念: Memory Window 简称 MW,是一种由用户申请的,用于让远端节点访问本端内存区域的一种 RDMA 资源(因此 MW 只有 R_KEY,没有 L_KEY)。每个 MW 都会绑定在一个已经注册的MR上,它相比于 MR 可以提供更灵活的远程访问权限控制。MW 可以粗略理解为是 MR 的子集,一个 MR 上可以划分出很多 MW,每个 MW 都可以设置自己的权限。用一张网络图表示:

  • MR/MW 权限关系: When binding a Memory Window, a Consumer can request any combination of remote access rights for the Window. However, if the associated Region does not have local write access enabled and the Consumer requests remote write or remote atomic access for the Window, the Channel Interface must return an error either at bind time or access time.

  • 应用场景:1. 以动态方式授予和撤销对已注册区域的远程访问权限,从而减少性能损失。2. 向不同的远程代理授予在相同的注册内存区域内不同的远程访问权限。

实现

用户态实现:

libibverbs api:

struct ibv_mw *ibv_alloc_mw(struct ibv_pd *pd, enum ibv_mw_type type);

struct ibv_mw {
        uint32_t                rkey;
        enum ibv_mw_type        type;
    	...
};

参数和返回值:

  • ibv_mw_type:IBV_MW_TYPE_1 这种类型只能通过 ibv_bind_mw 方式绑定 MR。IBV_MW_TYPE_2 通过 ibv_post_send 方式绑定 MR。
  • rkey:由 HCA 生成的 rkey。内核驱动实现非常简单,直接拼装参数向硬件发送命令。

内核实现:

mlx5_ib_alloc_mw 构建 MKey Context 提交 HCA
        1. 构建 MKey Context:
            mkc.free
            mkc.pd
            mkc.umr_en
            mkc.en_rinval
        2. mlx5_ib_create_mkey 提交请求,返回 rkey

绑定 memory window 方法一:

// Bind a memory window to a region
int ibv_bind_mw(struct ibv_qp *qp, struct ibv_mw *mw, struct ibv_mw_bind *mw_bind);

struct ibv_mw_bind {
    	uint64_t                     wr_id;           /* User defined WR ID */
    	unsigned int                 send_flags;      /* Use ibv_send_flags */
    	struct ibv_mw_bind_info      bind_info;       /* MW bind information */
}
struct ibv_mw_bind_info {
		struct ibv_mr                *mr;             /* The MR to bind the MW to */
		uint64_t                     addr;            /* The address the MW should start at */
		uint64_t                     length;          /* The length (in bytes) the MW should span */
		unsigned int                 mw_access_flags; /* Access flags to the MW. Use ibv_access_flags */
};

mw_access_flags:
IBV_ACCESS_REMOTE_WRITE
IBV_ACCESS_REMOTE_READ
IBV_ACCESS_REMOTE_ATOMIC
IBV_ACCESS_ZERO_BASED

int mlx5_bind_mw(struct ibv_qp *qp, struct ibv_mw *mw, struct ibv_mw_bind *mw_bind)
		...
        // 初始化 wr
        struct ibv_send_wr wr;
        wr.opcode = IBV_WR_BIND_MW;
        wr.send_flags = mw_bind->send_flags;
        wr.bind_mw.bind_info = mw_bind->bind_info;
        wr.bind_mw.mw = mw;
        wr.bind_mw.rkey = mw->rkey;

		// post send 方式提交绑定 memory window 请求
        _mlx5_post_send(qp, &wr, ...);
        ...

绑定 memory window 方法二:更加灵活的方式拼装 WQE,提交请求

ibv_post_send

思考

  • MW addr 地址必须在 MR 范围内吗?在 RDMA 编程中,注册的 Memory Window (MW) 必须绑定到某个已注册的 Memory Region (MR) 内,不能独立存在或超出 MR 的范围。MR 是真正进行内存注册和地址翻译(虚拟地址 → 物理地址)的单元,RDMA 网卡硬件依赖 MR 来验证和访问内存。MW 本身不做内存注册,它只是对 MR 的访问权限控制和范围细化,主要用于动态授予/撤销远程访问权限。此外,频繁 MR 操作性能开销大,MW 相对轻量级。

篇尾:

  • HUATUO 华佗是由滴滴开源并依托 CCF 孵化的操作系统深度观测项目。
  • 关注微信公众号,或扫码加微信,邀请你加入用户群(请备注姓名+单位):

微信