在许多情况下,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 生成完成通知。