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)