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/