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.
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:
A NIC:
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.
Calcula um valor de hash.
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.
Interrompe o sistema.
Os buffers recebidos que o sistema manipula em uma interrupção são distribuídos entre as CPUs.
O NDIS chama a FUNÇÃO MiniportInterrupt (MiniportInterrupt ) do driver de miniport em uma CPU determinada pelo sistema.
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.
O NDIS chama a função MiniportInterruptDPC para cada DPC enfileirado. O DPC em uma determinada CPU:
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.
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.