admin管理员组

文章数量:1037775

RDMA 完成事件和异步事件

术语

  • EE: 端到端
  • CI: 通道接口

简介

CE和AE一般与中断关联, 通过中断上报处理CE和AE, 这样可以降低CPU使用率(相对忙轮询(ibv_poll_cq)), 异步事件在非IO线程上处理事件, 正常情况下不影响IO路径

完成事件控制器

当消费者请求完成通知时(ibv_req_notify_cq)调用的处理程序,并将条目添加到与处理程序标识符关联的完成队列中

异步完成通知(10.8.7 ASYNCHRONOUS COMPLETION NOTIFICATION)

消费者可以注册多个完成通知例程,每个完成事件一个,当使用设置完成事件处理程序动词向 CQ 添加新条目时调用该例程。

C10-109:本合规声明已过时。

C10-109.2.1:CI 应支持每个 HCA 注册一个 CQ 事件处理程序。CI 必须确保消费者可以成功设置一个完成事件处理程序。

o10-54.2.1:如果 CI 支持基本队列管理扩展,则 CI 必须:• 支持一个或多个完成事件处理程序;• 通过查询 HCA 动词返回 HCA 支持的完成事件处理程序的数量;• 通过设置完成事件处理程序动词,将完成处理程序地址与完成处理程序标识符关联;• 通过设置完成事件处理程序动词清除现有的完成事件处理程序;并且 • 通过创建 CQ 动词,将完成处理程序标识符关联到 CQ

C10-110:此合规声明已过时。

C10-110.2.1:如果 HCA 不支持基本队列管理扩展,则 CI 应将与完成事件标识符相关联的任何先前的处理程序替换为新的设置完成事件动词通知中指定的处理程序。

o10-54.2.2:如果 HCA 支持基本队列管理扩展,并且消费者指定了非零的完成事件处理程序地址,则 CI 应将与完成事件标识符相关联的任何先前的处理程序替换为新的设置完成事件动词通知中指定的处理程序。如果消费者指定零完成事件处理程序地址,则 CI 应清除任何先前的处理程序。如果消费者引用现有的完成事件处理程序标识符并清除了如上所述的先前的处理程序,那么消费者就不能使用相同的完成事件处理程序标识符,直到它从设置完成事件处理程序动词返回。请求完成通知动词是基于每个 CQ 设置的。这是一个一次性通知;每次调用此动词最多会生成一个通知。一旦启用 CQ 通知,额外的请求完成通知调用将不起作用。当下一个条目添加到指定为此动词的修饰符的 CQ 时,将调用一次处理程序。请求事件的存在可能会影响此行为。有关详情,请参阅第 680 页的 11.4.2.2 请求完成通知和第 260 页的 9.2.3 请求事件 (SE) - 1 位

C10-111:CQ 最多应有一个未完成的完成事件通知请求。

C10-112:当满足未完成的完成事件请求的 CQ 条目添加到 CQ 时,CI 应生成单个完成事件。

C10-113:在注册完成通知请求时,CI 不得为指定 CQ 上的现有 CQ 条目生成完成事件。直到下一个条目添加到 CQ 后,才会生成通知。使用请求完成通知时,应使用以下调用顺序,以确保不会错过指定 CQ 的新 CQ 条目。1) 轮询完成以取消现有 CQ 条目的排队。2) 请求完成通知。3) 轮询完成以拾取在调用第一个轮询完成和启用通知之间添加的任何 CQ 条目。如果未注册处理程序,则不会生成通知。调用处理程序例程时,将提供哪个 CQ 已生成完成通知的指示。调用处理程序例程后,消费者必须再次调用请求完成通知,以便在 CQ 中添加新条目时收到通知。

C10-114:对于每个完成事件,CI 应指示哪个 CQ 导致生成该事件。消费者负责轮询 CQ 以检索工作完成情况。通知发生时不会自动执行此功能

事件控制器(EVENT HANDLING)

设置完成事件(CE)控制器

描述:将完成处理程序标识符与完成事件处理程序地址关联。如果 HCA 支持基本队列管理扩展,则每个 HCA 可以注册多个 CQ 事件处理程序。对于给定的完成处理程序标识符,对此动词的其他调用将覆盖与完成处理程序标识符关联的完成事件处理程序地址。此调用不会自动请求完成事件的通知。必须调用请求完成通知动词才能请求通知(ibv_req_notify_cq)。

传递给 CQ 事件处理程序的参数包括:

• HCA 句柄。

• CQ 句柄。

输入:

• HCA 句柄。

• 完成事件处理程序地址。

• 完成事件处理程序标识符:

• 如果为零,CI 将创建完成处理程序标识符并分配完成事件处理程序地址。

• 如果非零,CI 将替换与完成事件处理程序标识符标识的现有完成处理程序关联的完成事件处理程序地址。如果完成事件处理程序地址为零,则清除完成事件处理程序地址。注意:当 CQ 与已清除的完成事件处理程序相关联时,不得生成完成事件。

输出:

• 完成事件处理程序标识符。仅当输入修饰符“完成事件处理程序标识符”设置为零时才返回。

• 执行结果:

• 操作成功完成。

• HCA 句柄无效。

• 完成事件处理程序标识符无效。

• HCA 不支持基本队列管理扩展

• 资源不足,无法完成请求。

设置异步事件(AE)控制器

描述:注册异步事件处理程序。每个 HCA 只能注册一个异步事件处理程序。对此动词的额外调用将覆盖要调用的处理程序例程。额外的调用不会生成额外的处理程序例程。C11-32:即使在已注册现有异步事件处理程序的情况下,CI 也应使用此动词中指定的异步事件处理程序。注册异步事件处理程序后,所有后续异步事件都将导致调用该处理程序。在注册异步事件处理程序之前,异步事件将丢失。

调用异步事件处理程序时传递给它的参数包括:

• HCA 句柄。

• 事件记录。这包含指示资源类型和标识符以及发生哪个事件的信息。有关更多信息,请参阅异步事件。

输入修饰符:• HCA 句柄。• 处理程序地址。输出修饰符:

执行结果:• 操作已成功完成。• 无效的 HCA 句柄

异步事件

本节介绍异步事件。异步事件分为四类:关联异步事件、关联异步错误、非关联异步事件和非关联异步错误。两种异步错误均在第 564 页的 10.10.2.3 异步错误中定义。关联异步事件被分为两类,因为事件发生时 QP/EE 上下文的行为不同。C11-33:关联异步错误发生时,CI 应使 QP/EE 转换为错误状态。C11-34:关联异步事件发生时,CI 必须使 QP/EE 保持异步事件发生时的 QP/EE 状态。非关联异步错误是那些不能与特定 QP 或 EE 上下文关联的错误。动词使用者必须注册一个处理程序,如设置异步事件处理程序中所述,以便收到异步事件发生的通知。此机制用于收集有关事件和错误的信息

关联异步事件(Affiliated asynchronous events)

关联异步事件是向 Verb Consumer 发出的建议,告知其在指定的 QP 或 EE 上下文中发生了指定的事件。通道接口不将此类别中的事件视为错误,因此 QP/EE 状态保持不变。如:

• 路径已迁移 - 表示连接已迁移到备用路径。

• 通信已建立 - 表示第一个数据包已到达接收工作队列,其中 QP/EE 仍处于 RTR 状态。事件记录中返回此数据包目的地 QP/EE 的句柄。通信管理器可以使用此事件,如第 750 页 12.9.6 通信建立 - 被动中的状态图所示,并在 12.9.7.2 被动状态中所述。通信管理器可以在已处于已建立状态时接收此事件;这不是错误。

C11-35:对于 RC 和 UC 服务,如果第一个数据包在 QP 仍处于 RTR 状态时到达,并且第一个数据包处理无误,则 CI 应生成“通信已建立关联异步事件”。在某些错误条件下,CI 可以生成此关联异步事件,但除非入站数据包验证至少在“实际 PSN=ePSN?”框中无错误(见图 90、图 115),否则不得生成该事件。o11-5.1.1:如果 CI 支持 RD 服务,如果第一个数据包在 EEC 仍处于 RTR 状态时到达,并且第一个数据包处理无误,则 CI 应生成“通信已建立关联异步事件”。在某些错误条件下,CI 可以生成此关联异步事件,但除非入站数据包验证至少在“实际 PSN=ePSN?”框中无错误(见图 91),否则不得生成该事件。对于 UD 和 Raw 服务类型,允许生成“通信已建立关联异步事件”,但强烈不建议这样做。

• 发送队列已排空(Send Queue Drained) - 表示在请求状态更改时,指定队列对或 EE 的发送队列已完成正在进行的未完成消息,并且(如果适用)已收到这些消息的所有确认;如果转换到 SQD 的状态因转换到 SQError、Error 或 Reset 状态而中止,也会生成此事件。

o11-5.2.4:如果 HCA 支持 SRQ,对于 RC 和 UD 服务,如果 SRQ 限制事件生成机制已启动并且达到 SRQ 限制,CI 应生成“SRQ 限制已达到关联异步事件”。只要 SRQ WQE 的数量小于 SRQ 限制,就会达到 SRQ 限制。 o11-35.2-1.1:如果 HCA 支持将 UC QP 附加到 SRQ,则 CI 应按照 o11-5.2.4 中规定的方式报告“SRQ 限制已达到关联异步事件”:当事件生成时,CI 应将 SRQ 限制重置为零。o11-5.2.5:如果 HCA 支持 SRQ,对于 RC 和 UD 服务,当出现以下情况时,CI 应在处于错误状态并与 SRQ 关联的 QP 上生成“最后一个 WQE 已达到关联异步事件”:

• 为最后一个 WQE 生成 CQE,或

• QP 处于错误状态并且 RQ 上没有更多 WQE。

o11-5.2.6:如果 HCA 支持 SRQ,对于 RC 和 UD 服务,CI 在同一 QP 上出现本地工作队列灾难性错误后,不得在 QP 上生成上次到达 WQE 关联异步事件。o11-35.2-1.2:如果 HCA 支持将 UC QP 附加到 SRQ,则 CI 应报告上次到达 WQE 关联异步事件,如 o11-5.2.5 和 o11-5.2.6 中所述:如果 HCA 遇到本地工作队列灾难性错误,并且未发生上次到达 WQE 关联异步事件,则消费者必须销毁所有 QP 和 SRQ 以回收与该 QP 关联的所有 WQE

关联异步错误(AFFILIATED ASYNCHRONOUS ERRORS)

• CQ 错误 - 表示在将条目写入完成队列时发生错误。

C11-36:在将条目写入 CQ 时发生 CQ 溢出以外的错误时,CI 应生成 CQ 错误。C11-37:检测到 CQ 溢出时,CI 应生成 CQ 错误。这种情况将导致任何相关工作队列在尝试使用该 CQ 时发生关联异步错误。无法再将完成添加到 CQ。无法保证可以检索发生错误时 CQ 中存在的完成。可能的原因包括 CQ 溢出或 CQ 保护错误。

• 本地工作队列灾难性错误 - 访问或处理工作队列时发生错误,导致无法报告完成。

C11-38:当与导致生成 CQ 错误的 CQ 关联的工作队列尝试使用该 CQ 时,CI 应生成本地工作队列灾难性错误。 C11-39:如果在访问或处理工作队列时发生错误而无法报告完成,则 CI 应生成本地工作队列灾难性错误。

• 无效请求本地工作队列错误 - 传输层在响应方检测到传输 OpCode 违规。可能的原因是:不支持或保留的 OpCode;或 OpCode 顺序错误。C11-39.1.1:对于 RC 服务,如果传输层在响应方检测到传输 OpCode 违规,则 CI 应生成无效请求本地工作队列错误。响应方的附属 QP 应置于错误状态。

• 本地访问违规工作队列错误 - 传输层在响应方检测到请求访问违规。可能的原因是:原子未对齐;RDMA 读取或原子请求过多;R_Key 违规;或没有直接数据的长度错误。 C11-39.1.2:对于 RC 服务,当传输层检测到响应方的请求访问冲突时,CI 应生成本地访问冲突工作队列错误。响应方的附属 QP 应置于错误状态。

• 本地 EE 上下文灾难性错误 - 访问或处理 EE 上下文时发生错误,导致无法报告完成。o11-5.a1:如果 CI 支持 RD 服务,当访问或处理 EE 上下文时发生错误,导致无法报告完成时,CI 应生成 EE 上下文灾难性错误。

• 路径迁移请求错误 - 表示未接受对此 QP/EE 的传入路径迁移请求。验证过程在迁移请求部分中定义。o11-6:如果 CI 支持自动路径迁移,当未接受对此 QP/EE 的传入路径迁移请求时,CI 应生成路径迁移请求错误。

• SRQ 灾难性错误 - 处理或访问 SRQ 时发生错误,导致无法从 SRQ 中出队 WQE 并报告接收完成。

o11-6.2.1:如果 HCA 支持 SRQ,如果发生“资源未就绪”以外的错误导致 HCA 无法从 SRQ 中出队 WQE,则 CI 应生成 SRQ 灾难性错误。发生此错误时,CI 应将 SRQ 置于错误状态。 o11-6.2.2:如果 HCA 支持 SRQ,对于与 SRQ 关联的 QP,如果出现以下情况,CI 应生成本地工作队列灾难性错误并将 QP 置于错误状态:

• 发生“资源未就绪”以外的错误导致 HCA 无法从 SRQ 中出队 WQE;或

• QP 尝试从 SRQ 中出列 WQE,但关联的 SRQ 已处于错误状态。

以下描述了 XRC TGT QP 的新关联异步错误:

• XRC 域违规 - 响应方的接收队列检测到与 XRC SRQ 的 XRC 域不匹配的 XRC 域。

• 无效 XRCETH - 响应方检测到 XRC SRQ 不存在或状态不正确或有线协议违规

非关联异步事件

• 端口活动 - 当链路变为活动状态时发出。 o11-6.1.1:如果支持端口活动事件,则当链路声明为活动状态时,CI 应生成端口活动事件。使用下面端口错误描述中“可用”和“不可用”状态的定义,当与 HCA 端口关联的链路从不可用状态转换为可用状态时,将生成“端口活动”事件。

• 客户端重新注册事件 - 当 SM 请求客户端重新注册时发出(请参阅第 1011 页的 14.4.11 客户端重新注册)。 o11-6.2.3:如果 CI 指示端口支持客户端重新注册,则当 SMA 从 SM 收到此请求时,CI 应生成客户端重新注册事件。

• 端口更改事件 - 当端口属性更改时发出。 o11-39.2-1.1:如果支持可选端口更改事件,则当下面列出的任何端口属性更改时,CI 应生成端口更改事件。该事件将伴随一组标志,指示哪些端口属性已发生更改。

• SGID 表 - SGID 表已更改。

• P_Key 表 - P_Key 表已更改。

• MasterSM Lid - Master SM LID 已更改。

• MasterSM SL - Master SM SL 已更改。

• SubnetTimeout - SubnetTimeout 已更改。

• IsSMDisabled - IsSMDisabled 功能掩码位已更改。

• IsClientReregistrationSupported - IsClientReregistrationSupported 功能掩码位已更改

非关联错误事件

• 本地灾难性错误 - 发生的错误不能归因于任何资源,并且 CI 行为不确定。C11-40:当发生错误不能归因于任何资源,并且 CI 行为不确定时,CI 应生成本地灾难性错误。

• 端口错误 - 当链接被声明为不可用时发出。C11-41:当链接被声明为不可用时,CI 应生成端口错误。端口错误不应对 QP/EE 状态产生影响。使用链接状态的定义,“不可用”状态被视为:关闭、初始化和启用。“可用”状态为活动和 ActDefer。当与 HCA 端口关联的链接从可用状态转换为不可用状态时,将生成“端口错误”无关异步错误

参考

IB Spec 1.4, 第11.5/11.6章, A18.3.10异步事件

E810/MLX5/HNS等中断驱动实现

RDMA 完成事件和异步事件

术语

  • EE: 端到端
  • CI: 通道接口

简介

CE和AE一般与中断关联, 通过中断上报处理CE和AE, 这样可以降低CPU使用率(相对忙轮询(ibv_poll_cq)), 异步事件在非IO线程上处理事件, 正常情况下不影响IO路径

完成事件控制器

当消费者请求完成通知时(ibv_req_notify_cq)调用的处理程序,并将条目添加到与处理程序标识符关联的完成队列中

异步完成通知(10.8.7 ASYNCHRONOUS COMPLETION NOTIFICATION)

消费者可以注册多个完成通知例程,每个完成事件一个,当使用设置完成事件处理程序动词向 CQ 添加新条目时调用该例程。

C10-109:本合规声明已过时。

C10-109.2.1:CI 应支持每个 HCA 注册一个 CQ 事件处理程序。CI 必须确保消费者可以成功设置一个完成事件处理程序。

o10-54.2.1:如果 CI 支持基本队列管理扩展,则 CI 必须:• 支持一个或多个完成事件处理程序;• 通过查询 HCA 动词返回 HCA 支持的完成事件处理程序的数量;• 通过设置完成事件处理程序动词,将完成处理程序地址与完成处理程序标识符关联;• 通过设置完成事件处理程序动词清除现有的完成事件处理程序;并且 • 通过创建 CQ 动词,将完成处理程序标识符关联到 CQ

C10-110:此合规声明已过时。

C10-110.2.1:如果 HCA 不支持基本队列管理扩展,则 CI 应将与完成事件标识符相关联的任何先前的处理程序替换为新的设置完成事件动词通知中指定的处理程序。

o10-54.2.2:如果 HCA 支持基本队列管理扩展,并且消费者指定了非零的完成事件处理程序地址,则 CI 应将与完成事件标识符相关联的任何先前的处理程序替换为新的设置完成事件动词通知中指定的处理程序。如果消费者指定零完成事件处理程序地址,则 CI 应清除任何先前的处理程序。如果消费者引用现有的完成事件处理程序标识符并清除了如上所述的先前的处理程序,那么消费者就不能使用相同的完成事件处理程序标识符,直到它从设置完成事件处理程序动词返回。请求完成通知动词是基于每个 CQ 设置的。这是一个一次性通知;每次调用此动词最多会生成一个通知。一旦启用 CQ 通知,额外的请求完成通知调用将不起作用。当下一个条目添加到指定为此动词的修饰符的 CQ 时,将调用一次处理程序。请求事件的存在可能会影响此行为。有关详情,请参阅第 680 页的 11.4.2.2 请求完成通知和第 260 页的 9.2.3 请求事件 (SE) - 1 位

C10-111:CQ 最多应有一个未完成的完成事件通知请求。

C10-112:当满足未完成的完成事件请求的 CQ 条目添加到 CQ 时,CI 应生成单个完成事件。

C10-113:在注册完成通知请求时,CI 不得为指定 CQ 上的现有 CQ 条目生成完成事件。直到下一个条目添加到 CQ 后,才会生成通知。使用请求完成通知时,应使用以下调用顺序,以确保不会错过指定 CQ 的新 CQ 条目。1) 轮询完成以取消现有 CQ 条目的排队。2) 请求完成通知。3) 轮询完成以拾取在调用第一个轮询完成和启用通知之间添加的任何 CQ 条目。如果未注册处理程序,则不会生成通知。调用处理程序例程时,将提供哪个 CQ 已生成完成通知的指示。调用处理程序例程后,消费者必须再次调用请求完成通知,以便在 CQ 中添加新条目时收到通知。

C10-114:对于每个完成事件,CI 应指示哪个 CQ 导致生成该事件。消费者负责轮询 CQ 以检索工作完成情况。通知发生时不会自动执行此功能

事件控制器(EVENT HANDLING)

设置完成事件(CE)控制器

描述:将完成处理程序标识符与完成事件处理程序地址关联。如果 HCA 支持基本队列管理扩展,则每个 HCA 可以注册多个 CQ 事件处理程序。对于给定的完成处理程序标识符,对此动词的其他调用将覆盖与完成处理程序标识符关联的完成事件处理程序地址。此调用不会自动请求完成事件的通知。必须调用请求完成通知动词才能请求通知(ibv_req_notify_cq)。

传递给 CQ 事件处理程序的参数包括:

• HCA 句柄。

• CQ 句柄。

输入:

• HCA 句柄。

• 完成事件处理程序地址。

• 完成事件处理程序标识符:

• 如果为零,CI 将创建完成处理程序标识符并分配完成事件处理程序地址。

• 如果非零,CI 将替换与完成事件处理程序标识符标识的现有完成处理程序关联的完成事件处理程序地址。如果完成事件处理程序地址为零,则清除完成事件处理程序地址。注意:当 CQ 与已清除的完成事件处理程序相关联时,不得生成完成事件。

输出:

• 完成事件处理程序标识符。仅当输入修饰符“完成事件处理程序标识符”设置为零时才返回。

• 执行结果:

• 操作成功完成。

• HCA 句柄无效。

• 完成事件处理程序标识符无效。

• HCA 不支持基本队列管理扩展

• 资源不足,无法完成请求。

设置异步事件(AE)控制器

描述:注册异步事件处理程序。每个 HCA 只能注册一个异步事件处理程序。对此动词的额外调用将覆盖要调用的处理程序例程。额外的调用不会生成额外的处理程序例程。C11-32:即使在已注册现有异步事件处理程序的情况下,CI 也应使用此动词中指定的异步事件处理程序。注册异步事件处理程序后,所有后续异步事件都将导致调用该处理程序。在注册异步事件处理程序之前,异步事件将丢失。

调用异步事件处理程序时传递给它的参数包括:

• HCA 句柄。

• 事件记录。这包含指示资源类型和标识符以及发生哪个事件的信息。有关更多信息,请参阅异步事件。

输入修饰符:• HCA 句柄。• 处理程序地址。输出修饰符:

执行结果:• 操作已成功完成。• 无效的 HCA 句柄

异步事件

本节介绍异步事件。异步事件分为四类:关联异步事件、关联异步错误、非关联异步事件和非关联异步错误。两种异步错误均在第 564 页的 10.10.2.3 异步错误中定义。关联异步事件被分为两类,因为事件发生时 QP/EE 上下文的行为不同。C11-33:关联异步错误发生时,CI 应使 QP/EE 转换为错误状态。C11-34:关联异步事件发生时,CI 必须使 QP/EE 保持异步事件发生时的 QP/EE 状态。非关联异步错误是那些不能与特定 QP 或 EE 上下文关联的错误。动词使用者必须注册一个处理程序,如设置异步事件处理程序中所述,以便收到异步事件发生的通知。此机制用于收集有关事件和错误的信息

关联异步事件(Affiliated asynchronous events)

关联异步事件是向 Verb Consumer 发出的建议,告知其在指定的 QP 或 EE 上下文中发生了指定的事件。通道接口不将此类别中的事件视为错误,因此 QP/EE 状态保持不变。如:

• 路径已迁移 - 表示连接已迁移到备用路径。

• 通信已建立 - 表示第一个数据包已到达接收工作队列,其中 QP/EE 仍处于 RTR 状态。事件记录中返回此数据包目的地 QP/EE 的句柄。通信管理器可以使用此事件,如第 750 页 12.9.6 通信建立 - 被动中的状态图所示,并在 12.9.7.2 被动状态中所述。通信管理器可以在已处于已建立状态时接收此事件;这不是错误。

C11-35:对于 RC 和 UC 服务,如果第一个数据包在 QP 仍处于 RTR 状态时到达,并且第一个数据包处理无误,则 CI 应生成“通信已建立关联异步事件”。在某些错误条件下,CI 可以生成此关联异步事件,但除非入站数据包验证至少在“实际 PSN=ePSN?”框中无错误(见图 90、图 115),否则不得生成该事件。o11-5.1.1:如果 CI 支持 RD 服务,如果第一个数据包在 EEC 仍处于 RTR 状态时到达,并且第一个数据包处理无误,则 CI 应生成“通信已建立关联异步事件”。在某些错误条件下,CI 可以生成此关联异步事件,但除非入站数据包验证至少在“实际 PSN=ePSN?”框中无错误(见图 91),否则不得生成该事件。对于 UD 和 Raw 服务类型,允许生成“通信已建立关联异步事件”,但强烈不建议这样做。

• 发送队列已排空(Send Queue Drained) - 表示在请求状态更改时,指定队列对或 EE 的发送队列已完成正在进行的未完成消息,并且(如果适用)已收到这些消息的所有确认;如果转换到 SQD 的状态因转换到 SQError、Error 或 Reset 状态而中止,也会生成此事件。

o11-5.2.4:如果 HCA 支持 SRQ,对于 RC 和 UD 服务,如果 SRQ 限制事件生成机制已启动并且达到 SRQ 限制,CI 应生成“SRQ 限制已达到关联异步事件”。只要 SRQ WQE 的数量小于 SRQ 限制,就会达到 SRQ 限制。 o11-35.2-1.1:如果 HCA 支持将 UC QP 附加到 SRQ,则 CI 应按照 o11-5.2.4 中规定的方式报告“SRQ 限制已达到关联异步事件”:当事件生成时,CI 应将 SRQ 限制重置为零。o11-5.2.5:如果 HCA 支持 SRQ,对于 RC 和 UD 服务,当出现以下情况时,CI 应在处于错误状态并与 SRQ 关联的 QP 上生成“最后一个 WQE 已达到关联异步事件”:

• 为最后一个 WQE 生成 CQE,或

• QP 处于错误状态并且 RQ 上没有更多 WQE。

o11-5.2.6:如果 HCA 支持 SRQ,对于 RC 和 UD 服务,CI 在同一 QP 上出现本地工作队列灾难性错误后,不得在 QP 上生成上次到达 WQE 关联异步事件。o11-35.2-1.2:如果 HCA 支持将 UC QP 附加到 SRQ,则 CI 应报告上次到达 WQE 关联异步事件,如 o11-5.2.5 和 o11-5.2.6 中所述:如果 HCA 遇到本地工作队列灾难性错误,并且未发生上次到达 WQE 关联异步事件,则消费者必须销毁所有 QP 和 SRQ 以回收与该 QP 关联的所有 WQE

关联异步错误(AFFILIATED ASYNCHRONOUS ERRORS)

• CQ 错误 - 表示在将条目写入完成队列时发生错误。

C11-36:在将条目写入 CQ 时发生 CQ 溢出以外的错误时,CI 应生成 CQ 错误。C11-37:检测到 CQ 溢出时,CI 应生成 CQ 错误。这种情况将导致任何相关工作队列在尝试使用该 CQ 时发生关联异步错误。无法再将完成添加到 CQ。无法保证可以检索发生错误时 CQ 中存在的完成。可能的原因包括 CQ 溢出或 CQ 保护错误。

• 本地工作队列灾难性错误 - 访问或处理工作队列时发生错误,导致无法报告完成。

C11-38:当与导致生成 CQ 错误的 CQ 关联的工作队列尝试使用该 CQ 时,CI 应生成本地工作队列灾难性错误。 C11-39:如果在访问或处理工作队列时发生错误而无法报告完成,则 CI 应生成本地工作队列灾难性错误。

• 无效请求本地工作队列错误 - 传输层在响应方检测到传输 OpCode 违规。可能的原因是:不支持或保留的 OpCode;或 OpCode 顺序错误。C11-39.1.1:对于 RC 服务,如果传输层在响应方检测到传输 OpCode 违规,则 CI 应生成无效请求本地工作队列错误。响应方的附属 QP 应置于错误状态。

• 本地访问违规工作队列错误 - 传输层在响应方检测到请求访问违规。可能的原因是:原子未对齐;RDMA 读取或原子请求过多;R_Key 违规;或没有直接数据的长度错误。 C11-39.1.2:对于 RC 服务,当传输层检测到响应方的请求访问冲突时,CI 应生成本地访问冲突工作队列错误。响应方的附属 QP 应置于错误状态。

• 本地 EE 上下文灾难性错误 - 访问或处理 EE 上下文时发生错误,导致无法报告完成。o11-5.a1:如果 CI 支持 RD 服务,当访问或处理 EE 上下文时发生错误,导致无法报告完成时,CI 应生成 EE 上下文灾难性错误。

• 路径迁移请求错误 - 表示未接受对此 QP/EE 的传入路径迁移请求。验证过程在迁移请求部分中定义。o11-6:如果 CI 支持自动路径迁移,当未接受对此 QP/EE 的传入路径迁移请求时,CI 应生成路径迁移请求错误。

• SRQ 灾难性错误 - 处理或访问 SRQ 时发生错误,导致无法从 SRQ 中出队 WQE 并报告接收完成。

o11-6.2.1:如果 HCA 支持 SRQ,如果发生“资源未就绪”以外的错误导致 HCA 无法从 SRQ 中出队 WQE,则 CI 应生成 SRQ 灾难性错误。发生此错误时,CI 应将 SRQ 置于错误状态。 o11-6.2.2:如果 HCA 支持 SRQ,对于与 SRQ 关联的 QP,如果出现以下情况,CI 应生成本地工作队列灾难性错误并将 QP 置于错误状态:

• 发生“资源未就绪”以外的错误导致 HCA 无法从 SRQ 中出队 WQE;或

• QP 尝试从 SRQ 中出列 WQE,但关联的 SRQ 已处于错误状态。

以下描述了 XRC TGT QP 的新关联异步错误:

• XRC 域违规 - 响应方的接收队列检测到与 XRC SRQ 的 XRC 域不匹配的 XRC 域。

• 无效 XRCETH - 响应方检测到 XRC SRQ 不存在或状态不正确或有线协议违规

非关联异步事件

• 端口活动 - 当链路变为活动状态时发出。 o11-6.1.1:如果支持端口活动事件,则当链路声明为活动状态时,CI 应生成端口活动事件。使用下面端口错误描述中“可用”和“不可用”状态的定义,当与 HCA 端口关联的链路从不可用状态转换为可用状态时,将生成“端口活动”事件。

• 客户端重新注册事件 - 当 SM 请求客户端重新注册时发出(请参阅第 1011 页的 14.4.11 客户端重新注册)。 o11-6.2.3:如果 CI 指示端口支持客户端重新注册,则当 SMA 从 SM 收到此请求时,CI 应生成客户端重新注册事件。

• 端口更改事件 - 当端口属性更改时发出。 o11-39.2-1.1:如果支持可选端口更改事件,则当下面列出的任何端口属性更改时,CI 应生成端口更改事件。该事件将伴随一组标志,指示哪些端口属性已发生更改。

• SGID 表 - SGID 表已更改。

• P_Key 表 - P_Key 表已更改。

• MasterSM Lid - Master SM LID 已更改。

• MasterSM SL - Master SM SL 已更改。

• SubnetTimeout - SubnetTimeout 已更改。

• IsSMDisabled - IsSMDisabled 功能掩码位已更改。

• IsClientReregistrationSupported - IsClientReregistrationSupported 功能掩码位已更改

非关联错误事件

• 本地灾难性错误 - 发生的错误不能归因于任何资源,并且 CI 行为不确定。C11-40:当发生错误不能归因于任何资源,并且 CI 行为不确定时,CI 应生成本地灾难性错误。

• 端口错误 - 当链接被声明为不可用时发出。C11-41:当链接被声明为不可用时,CI 应生成端口错误。端口错误不应对 QP/EE 状态产生影响。使用链接状态的定义,“不可用”状态被视为:关闭、初始化和启用。“可用”状态为活动和 ActDefer。当与 HCA 端口关联的链接从可用状态转换为不可用状态时,将生成“端口错误”无关异步错误

参考

IB Spec 1.4, 第11.5/11.6章, A18.3.10异步事件

E810/MLX5/HNS等中断驱动实现

本文标签: RDMA 完成事件和异步事件