Compartilhar via


Esquema de processamento adiado do NDKPI

Há muitos casos em que um consumidor do NDK postará uma cadeia de solicitações de iniciador no QP (par de filas). Por exemplo, um consumidor pode postar várias solicitações de registro rápido seguidas por uma solicitação de envio. O desempenho desses padrões de solicitação poderá ser melhorado se a cadeia de solicitações for enfileirada para o QP e, em seguida, indicada ao hardware para processamento como um lote, em vez de indicar cada solicitação na cadeia para o hardware, uma por uma.

O valor do sinalizador NDK_OP_FLAG_DEFER pode ser usado para essa finalidade com os seguintes tipos de solicitação:

A presença do sinalizador é uma dica para o provedor NDK de que ele pode adiar indicando a solicitação de hardware para processamento, mas o provedor pode processar a nova solicitação a qualquer momento.

A presença do sinalizador NDK_OP_FLAG_DEFER em uma solicitação do iniciador não altera as responsabilidades existentes do provedor NDK em relação à geração de conclusões. Uma chamada para a solicitação do iniciador que retorna uma falha status não deve resultar em uma conclusão sendo enfileirada no CQ para a solicitação com falha. Por outro lado, uma chamada que retorna um êxito status deve eventualmente resultar em uma conclusão sendo enfileirada no CQ, desde que o consumidor siga os requisitos adicionais listados abaixo.

Além de todos os requisitos existentes do NDK, dois requisitos adicionais (um para o provedor e outro para o consumidor) devem ser observados para evitar uma situação em que as solicitações sejam postadas com êxito no QP com o sinalizador NDK_OP_FLAG_DEFER , mas nunca são indicadas ao hardware para processamento:

  • Ao retornar uma falha status de uma chamada para uma solicitação de iniciador, o provedor deve garantir que todas as solicitações enviadas anteriormente com o sinalizador NDK_OP_FLAG_DEFER sejam indicadas ao hardware para processamento.
  • O consumidor garante que, na ausência de uma falha embutida, todas as cadeias de solicitação do iniciador serão encerradas por uma solicitação iniciador que não define o sinalizador de NDK_OP_FLAG_DEFER .

Por exemplo, considere um caso em que um consumidor tenha uma cadeia de duas solicitações de registro rápido e um envio que ele precisa postar no QP:

  1. O consumidor posta o primeiro registro rápido com o sinalizador NDK_OP_FLAG_DEFER e NdkFastRegister retorna STATUS_SUCCESS.
  2. Novamente, o segundo registro rápido é postado com o sinalizador NDK_OP_FLAG_DEFER definido, mas agora NdkFastRegister retorna uma falha status. Nesse caso, o consumidor não postará a solicitação de envio.
  3. Ao retornar a falha embutida para a segunda chamada para NdkFastRegister, o provedor NDK garante que todas as solicitações não dedicadas anteriormente (o primeiro registro rápido neste caso) sejam indicadas ao hardware para processamento.
  4. Como a primeira chamada para NdkFastRegister foi bem-sucedida, uma conclusão deve ser gerada para o CQ.
  5. Como a segunda chamada para NdkFastRegister falhou embutida, uma conclusão não deve ser gerada para o CQ.

NDKPI (Network Direct Kernel Provider Interface)