1 QP State Machine
QP状态机示意图如下所示,注意事项如下:
- 实线箭头表示software执行Modify QP verb引起状态改变。
- 虚线箭头表示检测到错误时发生自定状态更改。
- 使用Modify QP verb,software可以命令QP从任何其他状态进入Reset状态。
- 使用Modify QP verb,software可以命令QP从任何其他状态进入Error状态。
QP在任何给定时间可能处于的状态有:
- Reset:基本QP已创建,但未配置。software可通过Modify QP verb命令QP返回Reset状态。
- Initialized(Init):
—RQ WR发布,但不处理RQ WR。如果QP接收任何入站请求包,应将其丢弃。
—禁止SQ WR发布与处理。
- RTR(Ready to Receive):
—RQ 发布与处理。RQ Logic可以处理入站message。如果是RC或RD QP,将生成远端QP的SQ Logic将接收的请求包的响应。
—禁止SQ WR发布与处理。
- RTS(Ready to Send):完全可操作的状态
—WR可同时发布到SQ与RQ。
—两个队列上的WR都会被处理。SQ Logic可以处理SQ WQE,并生成向远端QP的RQ Logic发送的出站请求包。
- SQD(SQ Drain):software打算修改一个运行的QP特性时,它命令QP进入SQD状态。进入此状态后,QP的SQ完成所有正在进行的message传输,为QP修改做准备。
- SQE(SQ Error):当SQ WQE错误完成时进入。software处理错误后,software可以重新发布更正后的失败WQE以及额外的SQ WQE,然后将QP转换为RTS状态。除RC QP外,所有类型的QP都实现此状态,RD EEC也不能实现。原因如下:
—当遇到某种类型的错误时,RC QP的SQ Logic以及RD EEC的Send Logic会自动retry纠正错误。
—如果Retry机制不能纠正错误,RC QP或RD EEC将直接从RTS状态转换为Error状态。
- Error:QP遇到不可恢复的错误时进入该状态。QP停止处理SQ与RQ上的WQE。
—SQ Logic不处理SQ WQE,也不生成发送至向远端QP的RQ Logic的出站请求包。
—RQ Logic停止响应远端QP的SQ Logic传输的入站请求包。
2 QP Creation
2.1 Create QP‘s CQ
software创建QP之前,须先创建一个或两个CQ,以便与将要创建的QP的SQ与RQ相关联。可以通过调用一次或两次Create QP verb来实现。
2.2 Create QP
创建CQ后,software通过执行Create QP verb创建QP。
2.3 Create QP Verb Results
verb调用的结果将是下列结果之一:
- 操作成功完成。
- 资源不足,无法完成。
- 无效HCA句柄。
- 无效CQ句柄。
- 请求的最大工作请求数超过了HCA的能力。
- 请求的scatter/gather元素的数量超过了HCA的能力。
- 无效保护域。
- QP的服务类型无效。
- 无效的RDD(仅适用RD)。
3 Software Control of QP State
software可通过执行Modify QP verb来更改QP的当前状态。根据QP的当前状态和要转换到的状态,协议将一些输入参数定义为必需,其他定义为可选的。
4 QP Setup Is Performed in a Defined Sequence
创建QP的初期(或如果QP已通过Modify QP verb被命令进入Reset状态),software将通过一系列定义的状态逐步推进,直到完全可操作:
① 创建后,QP立即处于Reset状态。既没有足够的消息发送消息,也没有足够的信息接收消息。
② 使用Modify QP verb,software为QP提供额外的信息,并将其状态转换为Init状态。
—发布RQ WR,但不处理RQ WQE。
—禁止SQ WR发布与处理。
③ 使用Modify QP verb,software向QP提供附加信息,将其转换为RTR状态。
—WR可同时发布到SQ与RQ。
—两个队列上的WQE都可以被处理。
5 Reset State
创建QP时进入Reset状态,当software执行Create QP verb时,verb命令HCA Logic创建(或保留)QP操作所需的基本资源,此时QP尚未准备好进行某种操作。使用Modify QP verb,software可以命令QP从任何其他状态进入Reset状态。
QP处于Reset状态时,具有以下特征:
- QP的SQ与RQ以及它们各自的CQ都是空的。若该QP与其他QP共享其CQ,这些CQ可能包含其他QP的CQE。
- 在SQ或RQ上发布WR是违法的,这样做会立即返回错误。
- 禁止处理两个队列上的WQE。
- 如果任何传入的数据包以此QP为目标,它将被静默丢弃。
从Reset状态开始,software可以将QP转换到的唯一有效状态是Init状态。因此,software执行Modify QP verb,下表为输入参数。
Input Parameter | Application QP Types | Required | Description |
---|---|---|---|
HCA Handle | All |
Yes | 由调用向前的Open HCA verb返回。 |
QP Handle | All | Yes | 由调用向前的Create QP verb返回。 |
Next State | All | Yes | Init状态。 |
Enable or disable the ability of the RQ Logic to handle incoming RDMA Reads |
RC、RD | Yes | Self-explanatory。 |
Enable or disable the ability of the RQ Logic to handle incoming RDMA Writes |
RC、RD、UD | Yes | Self-explanatory。 |
Enable or disable the ability of the RQ Logic to handle incoming Atomic requests |
RC、RD | Yes |