TBD;

RDMA & verbs API

RDMA支持gather list和scatter list,即允许不连续的数据发送到连续的地址空间,或者将连续的数据发送到不连续的地址空间。这个能力tcp也可以可以通过readv或者writev做到,但是RDMA结合单边语义做到gather/scatter就非常的强大了。

RDMA verbs的qp建连

资料:

(1)https://www.rdmamojo.com/2012/05/05/qp-state-machine/

(2)https://www.zhihu.com/column/c_1678877681314414592

RDMA和TCP不同,TCP本身的状态机转换,已经由其自己的下层实现了;但是RDMA本身的状态机需要用户自己维护,所以RDMA维护的困难之处:

(1)RDMA建立的qp链接构成的qp状态机需要调用者手动完成;

(2)RDMA qp链接的状态机更加复杂;

qp:queue pair

Reset: 这是qp的第一个状态,刚刚创建出来(通常是通过ibv_create_qp()创建)的qp处于该状态,该状态下的qp所有的资源均已申请好,但是还没有正确配置所以无法通信。创建qp是一个开销比较大的操作,因此做qp复用可以提升效率,复用qp前需要先将qp设置为Reset状态。处于任何状态的qp均可以直接设置到Reset状态。

Init(Initialize): 创建qp之后紧接着就需要使用ibv_modify_qp()将qp设置为Init状态,这是设置为RTR的必由之路。只能从Reset状态转换到Init。

RTR(Ready to Receive): 处于该状态的qp已经准备好接收数据,但是不能发送数据。只能从Init状态转换到RTR。

RTS(Ready to Send): 处于该状态的qp既可以接收数据,也可以发送数据。这个状态是qp最常工作的状态。可以从RTR或者SQD状态转换到RTS。

SQD(Send Queue Drained): 处于该状态的qp时,接收队列行为正常;已经提交的发送请求会被正确处理,新提交的发送请求不会被处理(可以提交但不会被处理,也不会报错)。只能从RTS转换到SQD。

SQE(Send Queue Error): 当UD、UC类型的qp处于RTS状态时,如果发送队列中发生错误,qp会被网卡自动切换到该状态(RC类型的qp这种情况下会直接切换到Error状态)。一旦处于该状态,发送队列中所有的请求都会产生错误事件,但接收队列仍然正常工作。

Error: 这是qp的最后一个状态,会在发生以下错误时被网卡自动切换到该状态:1. RC类型的qp的发送队列发生错误,或者 2. 任何类型的qp的接收队列发生错误。当然在任何状态下都可以通过显示调用ibv_modify_qp()转换到Error状态。销毁qp之前建议先修改到该状态。