Compartilhar via


RSS com enfileiramento de hardware

O RSS com enfileiramento de hardware melhora o desempenho do sistema em relação ao RSS com uma única solução de fila de recebimento de hardware. NICs que dão suporte à enfileiramento de hardware atribuem dados recebidos a várias filas de recebimento. As filas de recebimento são associadas a uma CPU. A NIC atribui dados recebidos a CPUs com base em valores de hash e em uma tabela de indireção.

A figura a seguir ilustra o RSS com a fila de recebimento de NIC.

Diagrama ilustrando rss com enfileiramento de recebimento nic.

Na figura, as setas tracejadas representam um caminho alternativo para o processamento de recebimento. O RSS não pode controlar a CPU que recebe a chamada ISR inicial. O driver não precisa enfileirar os dados para que ele possa agendar imediatamente os DPCs iniciais nas CPUs corretas.

O seguinte processo se repete para cada interrupção:

  1. A NIC:

    1. Usa o DMA para preencher buffers com dados recebidos.

      O driver de miniporte alocou os buffers de recebimento na memória compartilhada durante a inicialização.

    2. Calcula um valor de hash.

    3. Enfileira o buffer para uma CPU e fornece as atribuições de fila para o driver de miniporto.

      Por exemplo, a NIC pode executar um loop das etapas 1 a 3 e DMA uma lista de atribuições de CPU depois que alguns pacotes forem recebidos. O mecanismo específico é deixado para o design nic.

    4. Interrompe o sistema.

      Os buffers recebidos que o sistema manipula em uma interrupção são distribuídos entre as CPUs.

  2. O NDIS chama a FUNÇÃO MiniportInterrupt (MiniportInterrupt ) do driver de miniport em uma CPU determinada pelo sistema.

  3. O driver de miniporto solicita que o NDIS enfileira as DPCs (chamadas de procedimento adiado) para cada uma das CPUs que têm uma fila não vazia.

    Observe que todos os DPCs devem ser concluídos antes que o driver habilite as interrupções. Além disso, observe que o ISR pode estar em execução em uma CPU que não tem buffers para processar.

  4. O NDIS chama a função MiniportInterruptDPC para cada DPC enfileirado. O DPC em uma determinada CPU:

    1. Os builds recebem descritores para todos os buffers recebidos em sua fila e indica os dados na pilha do driver.

      Para obter mais informações, consulte Indicando que o RSS recebe dados.

    2. Habilitará as interrupções, se for o último DPC a ser concluído. Essa interrupção foi concluída e o processo será iniciado novamente. O driver deve usar uma operação atômica para identificar o último DPC a ser concluído. Por exemplo, o driver pode usar a função NdisInterlockedDecrement para implementar um contador atômico.