NDKPI 延迟处理方案

在许多情况下,NDK 使用者会将发起者请求链发布到队列对(QP)。 例如,用户可以发布大量快速注册请求,然后随即发起发送请求。 如果请求链排队至 QP,然后指示硬件以批量形式处理,而不是逐个将链中的每个请求发送到硬件时,此类请求模式的性能可能会有所改进。

NDK_OP_FLAG_DEFER标志值可用于以下请求类型:

此标志的存在向 NDK 提供程序表明,它可能会延迟指示将请求提交至硬件进行处理,但提供程序可以随时处理该新请求。

发起程序请求上存在 NDK_OP_FLAG_DEFER 标志不会更改 NDK 提供程序在生成完成方面的现有职责。 对返回失败状态的发起方请求的调用不得导致为失败请求在 CQ 中排队完成。 相反,返回成功状态的调用最终必须导致完成排队到 CQ,前提是使用者遵循下面列出的其他要求。

除了所有现有的 NDK 要求外,还必须遵循两个附加要求(一个用于提供者,一个用于消费者),以防止将请求成功发布到带有 NDK_OP_FLAG_DEFER 标志的 QP,但从未通知硬件进行处理:

  • 当从发起请求的调用返回失败状态时,提供程序必须确保所有以前使用 NDK_OP_FLAG_DEFER 标志提交的请求都传送给硬件进行处理。
  • 使用者保证,如果没有内联失败,所有发起程序请求链都将由未设置 NDK_OP_FLAG_DEFER 标志的发起程序请求终止。

例如,假设用户有一个包含两个快速注册请求的链,以及一个需要发布到 QP 的发送请求:

  1. 使用者使用 NDK_OP_FLAG_DEFER 标志发布第一个快速寄存器, NdkFastRegister 返回STATUS_SUCCESS。
  2. 再次,第二个快速寄存器在设置了 NDK_OP_FLAG_DEFER 标志后被发布,但此时 NdkFastRegister 返回了失败状态。 在这种情况下,使用者不会发布发送请求。
  3. 当第二次调用NdkFastRegister时返回内联失败,NDK 提供程序确保所有先前未指示的请求(比如第一次快速注册操作)都已经提交给硬件以便处理。
  4. 由于对 NdkFastRegister 的第一次调用成功,因此必须生成对 CQ 的完成。
  5. 由于对NdkFastRegister的第二次调用内联失败,因此不能向 CQ 生成完成通知。

网络直接内核提供者接口 (NDKPI)