Схема отложенной обработки 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 необходимо соблюдать два дополнительных требования (одно для поставщика и одно для потребителя), чтобы предотвратить ситуацию, когда запросы успешно отправляются в QP с флагом NDK_OP_FLAG_DEFER , но никогда не указываются на оборудование для обработки:
- При возврате состояния сбоя из вызова запроса инициатора поставщик должен гарантировать, что все запросы, которые ранее были отправлены с флагом 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.