Skip to the content.

rdma cm

RDMA CM 是 RDMA Connection Manager。它主要负责“怎么连上”,而不是“连上以后怎么收发数据”。

如果把 RDMA 程序拆层看:

它做的事可以概括成这几类。

  1. 地址解析

把你给的地址信息解析成 RDMA 能用的目标。

例如:

典型接口是:

所以它的第一步工作是: 把“我要连这个 IP:port”转换成“应该走哪块 RDMA 设备、哪个路径”。

  1. 建立连接

它负责 client/server 建连流程:

也就是把“谁来建 QP、谁来交换连接参数、什么时候连接进入 established”这些流程都封装起来。

  1. 事件通知

rdma_cm 是事件驱动的。它会给你各种连接相关事件,例如:

所以它像一个状态机框架,帮你把连接过程变成一串事件。

  1. 帮你协同 QP 参数

它不直接替代 verbs,但它能把连接流程和 QP 初始化串起来。

常见模式是:

所以你可以理解为:

  1. 断开与清理

连接断开时它也负责:

一句话区分

最典型调用链

client 侧常见流程:

  1. rdma_create_id()
  2. rdma_resolve_addr()
  3. rdma_resolve_route()
  4. rdma_create_qp()
  5. rdma_connect()
  6. 收到 ESTABLISHED
  7. 开始用 verbs 收发

server 侧常见流程:

  1. rdma_create_id()
  2. rdma_bind_addr()
  3. rdma_listen()
  4. 收到 CONNECT_REQUEST
  5. rdma_create_qp()
  6. rdma_accept()
  7. 收到 ESTABLISHED

内核里它大概在哪

你前面问过内核位置,对应主要是:

用户态对应是:

什么时候该用 rdma_cm

适合:

不一定用它的情况:

一句话总结

rdma_cm 解决的是“如何把两个 RDMA 端点连起来并维护连接状态”, 而 libibverbs 解决的是“连起来之后如何操作 QP/CQ/MR 传数据”。

如果你愿意,我下一步可以直接按源码给你讲 rdma_create_id -> rdma_resolve_addr -> rdma_connect 这一条完整路径, 在 librdmacm 和内核 cma.c/ucma.c 里分别在哪里。

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。