NDKPI 延迟处理方案
在许多情况下,NDK 使用者会将一系列发起程序请求发布到队列对 (QP) 。 例如,使用者可以发布多个快速注册请求,后跟发送请求。 如果请求链排队到 QP,然后指示硬件作为批处理进行处理,而不是逐个指示链中的每个请求到硬件,则可以提高此类请求模式的性能。
NDK_OP_FLAG_DEFER标志值可用于以下请求类型:
- NdkBind (NDK_FN_BIND)
- NdkFastRegister (NDK_FN_FAST_REGISTER)
- NdkInvalidate (NDK_FN_INVALIDATE)
- NdkRead (NDK_FN_READ)
- NdkSend (NDK_FN_SEND)
- NdkSendAndInvalidate (NDK_FN_SEND_AND_INVALIDATE)
- NdkWrite (NDK_FN_WRITE)
标志的存在是 NDK 提供程序的一个提示,它可能会延迟指示对硬件进行处理的请求,但提供程序可能随时处理新请求。
发起方请求中存在 NDK_OP_FLAG_DEFER 标志不会更改 NDK 提供程序在生成完成方面的现有责任。 对返回失败状态的发起方请求的调用不得导致在 CQ 中排队等待失败请求完成。 相反,返回成功状态的调用最终必须导致完成排队到 CQ,前提是使用者遵循下面列出的其他要求。
除了所有现有的 NDK 要求外,还必须遵守两个附加要求, (一个针对提供程序,另一个针对使用者) ,以防止请求成功发布到 具有NDK_OP_FLAG_DEFER 标志的 QP,但永远不会指示到硬件进行处理:
- 从调用发起方请求返回失败状态时,提供程序必须确保以前使用 NDK_OP_FLAG_DEFER 标志提交的所有请求都指示给硬件进行处理。
- 使用者保证,在没有内联故障的情况下,所有发起程序请求链都将由未设置 NDK_OP_FLAG_DEFER 标志的发起方请求终止。
例如,假设使用者有一个包含两个快速注册请求的链,以及一个需要发布到 QP 的发送:
- 使用者使用 NDK_OP_FLAG_DEFER 标志发布第一个快速寄存器, NdkFastRegister 返回STATUS_SUCCESS。
- 同样,第二个快速寄存器发布并设置了 NDK_OP_FLAG_DEFER 标志,但现在 NdkFastRegister 返回失败状态。 在这种情况下,使用者不会发布发送请求。
- 当返回第二次调用 NdkFastRegister 的内联失败时,NDK 提供程序确保以前未分配的所有请求 (在这种情况下的第一个快速寄存器) 指示给硬件进行处理。
- 由于对 NdkFastRegister 的第一次调用成功,因此必须对 CQ 生成完成。
- 由于对 NdkFastRegister 的第二次调用内联失败,因此不能向 CQ 生成完成。