RDMA-QP状态转换

QP状态转换

代码位置:ib_verbs.h

enum ib_qp_state {
	IB_QPS_RESET,
	IB_QPS_INIT,
	IB_QPS_RTR,
	IB_QPS_RTS,
	IB_QPS_SQD,
	IB_QPS_SQE,
	IB_QPS_ERR
};

在QP的生命周期当中,可能的状态可以是
1:Reset
2:Initialize(Init)
3:Ready To Receive(RTR)
4:Ready To Send(RTS)
5:Send Queue Drained (SQD)
6:Send Queue Error (SQE)
7:Error

QP可以通过两种可能的方式从一种状态转换到另一种状态:
(1)显式调用ibv_modify_qp()
(2)在处理错误的情况下,由设备自动转换

处于Reset状态的QP正在创建。
通过从任何状态调用ibv_modify_qp(),可以将任何QP转换到Reset或Error状态。

Reset state

Description

处于Reset状态的QP正在创建。在这种状态下,已经分配了QP的所有所需资源。
为了重用QP,可以通过调用ibv_modify_qp()将其从任何状态转换为Reset状态。如果在此状态转换之前,该QP的发送或接收队列中存在任何工作请求或完成,则它们将从队列中清除。

Work Requests

工作请求不应该被发布到发送或接收队列。尝试这样做将导致立即错误。发送和接收队列中的工作请求都不会被处理。

Packets

以该QP为目标的入站数据包将被静默丢弃。此QP将不发送任何数据包。

Init state

Description

为了移动到这个状态,必须从Reset状态调用ibv_modify_qp()。

Work Requests

工作请求只能被发送到接收队列。试图将工作请求发布到发送队列将导致立即错误。
发送和接收队列中的工作请求都不会被处理。

Packets

以该QP为目标传入的数据包将被静默丢弃。
此QP将不发送任何数据包。

RTR state

Description

为了移动到这个状态,必须从Init状态调用ibv_modify_qp()。
在RTR状态下,QP只能作为响应器使用。

Work Requests

工作请求只能发送到接收队列。试图将工作请求发布到发送队列将导致立即错误。
只有接收队列中的工作请求才会被处理。

Packets

到达此QP的数据包将被送达。QP将从这个QP发送数据包作为响应器(即:数据、ack和nacks)。

RTS state

Description

为了移动到这种状态,必须从RTR或SQD状态调用ibv_modify_qp()。
在RTS状态下,QP可以用作请求者,也可以用作响应者。

Work Requests

可以将工作请求发送到发送队列和接收队列。
将处理发送和接收队列中的工作请求。

Packets

到达此QP的数据包将被送达。QP将从这个QP发送数据包作为响应器(即:数据、ack和nacks)。
QP可以作为请求者发起数据包。

SQD state

Description

为了转移到这种状态,必须从RTS状态调用ibv_modify_qp()。
此状态只影响发送队列:
已经开始处理的工作请求将被处理,直到完全完成。但是,新的工作请求将不会被处理。
这个状态被分离为两个内部状态:
耗尽——发送队列中仍有工作请求正在被处理
已耗尽——发送队列中没有任何正在处理的工作请求
只有当QP的内部状态为drain时,才能将该QP的状态转换为RTS或SQD。

Work Requests

可以将工作请求发送到发送队列和接收队列。
接收队列中的工作请求将被处理。
已开始处理的发送队列中的工作请求将被完成,新的工作请求将不会被处理。

Packets

到达此QP的数据包将被送达。QP将从这个QP发送数据包作为响应器(即:数据、ack和nacks)。
QP可以作为请求者发起数据包。

SQE state

Description

对于所有QP类型,设备将自动转换到此状态,但处于RTS状态并在发送队列中处理以完成错误结束的工作请求的RC QP除外。这个工作请求的状态是未定义的(工作请求是部分处理还是完全处理是未知的),本地或远程缓冲区的内容(取决于使用的操作码)是未定义的。
发送队列中的所有后续工作请求将被错误刷新。
可以调用ibv_modify_qp()将其移回RTS状态以恢复发送队列。

Work Requests

可以将工作请求发送到发送队列和接收队列。
只有接收队列中的工作请求才会被处理。
发送队列的工作请求将被错误刷新。

Packets

到达此QP的数据包将被送达。
QP将从这个QP发送数据包作为响应器(即:数据、ack和nacks)。

ERROR state

Description

这是QP的状态机中的最后一个状态。
如果对于RC QP,发送队列中的工作请求完成后出现错误,或者对于任何QP类型,接收队列中的工作请求完成后出现错误,或者通过从任何状态显式调用ibv_modify_qp(), QP可以被设备自动转换到这种状态。如果QP状态是自动转换的,这个工作请求的状态是未定义的(工作请求是部分处理还是完全处理是未知的),本地或远程缓冲区的内容(取决于使用的操作码)是未定义的。

Work Requests

工作请求可以在发送队列和接收队列中发布。

Packets

在这篇文章中,我们讨论了QP的各种状态和该QP的行为。
下表总结了QP的行为取决于它的状态:

Summary

在这里插入图片描述
翻译:https://www.rdmamojo.com/2012/05/05/qp-state-machine/

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值