Reset state
QP可以通过两种方式获得Reset:
1:通过创建它
2:通过调用ibv_modify_qp()将其从任何其他状态移动到Reset状态
在创建QP时,需要花费一些时间来创建它(有上下文切换、为工作队列缓冲区分配内存、QP编号分配等)。
如果需要在快速路径中使用新的QP,较好的替代方法如下:
Create a QP
Use the QP (modify to RTS and send/receive data)
Destroy the QP
可以是:只创建一次QP,然后在需要时执行以下操作:
Use the QP (modify to RTS and send/receive data)
Modify the QP to Reset for later use
当QP不再被需要时,它可以被摧毁。
重用相同的QP可能比每次创建它更快。将QP从任何其他状态移动到Reset状态将清除前一个事务的所有“剩余”(例如发送和接收队列中的工作请求和完成)。
但是,不建议在相同的节点之间使用相同的qp,因为可能会出现意外的结果(包丢失)。
将QP移到Reset状态将阻止QP发送或接收报文。
Init state
当QP移动到RTR状态时,QP将处理传入的报文。如果由于任何原因(例如:操作系统调度程序没有给该进程时间),在转换到RTR状态后,工作请求没有被发布到该QP的接收队列中,那么这些包的请求者可能会发生接收器未准备好(RNR)错误。为了防止这种情况发生,可以在QP处于Init状态时向它发送接收请求。在QP转换到RTR状态之前,不会处理这些工作请求。
RTR state
在这种状态下,QP处理传入的报文。如果QP不被用作请求者(例如,工作请求不会被发布到它的发送队列中),QP可能会停留在RTR状态。
RTS state
在大多数应用程序中,qp将被转换到RTS状态。在这种状态下,QP可以作为请求者发送报文并处理传入的报文。即使您的QP不充当请求者,它也可以转换到这种状态。
SQD state
如果希望更改某些发送队列属性,他应该将QP转换为SQD状态,修改所需的属性,然后将QP转换回RTS状态,以便能够继续发送数据包。
SQE state
QP只能在发送队列中的工作请求以错误完成的情况下由设备自动转换到此状态。在这种状态下,发送队列不能作为请求者发送包。如果希望从这种状态恢复QP,他应该将QP修改回RTS状态。
ERROR state
QP可以通过两种方式移动到Reset:
1:自动,由RDMA设备的情况下完成与错误
2:将QP状态从其他状态移动到Error状态
如果出现错误,则收到错误的队列(发送或接收队列)的完成队列中的第一个完成将保持指示错误原因的状态。该队列和另一个队列中的其余工作请求将被错误地刷新。
此状态对于回收所有工作请求以释放其缓冲区非常有用(例如,如果工作请求中的wr_id属性指定此工作请求使用的缓冲区)。
将QP移到Error状态将导致QP无法发送或接收报文。
Destroying the QP
这本身不是一个QP状态,但是当用户使用完一个QP并希望阻止QP发送或接收数据包时,可以销毁它。