RSS com uma única fila de recebimento de hardware
Os drivers de miniport podem dar suporte a RSS para NICs que dão suporte ao cálculo de hash RSS e a uma única fila de descritores de recebimento.
A figura a seguir ilustra o processamento de RSS com uma única fila de descritores de recebimento.
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.
Ao contrário do processamento de recebimento não RSS, o processamento de recebimento baseado em RSS é distribuído em várias CPUs. Além disso, o processamento de uma determinada conexão pode ser vinculado a uma determinada CPU.
O processo a seguir se repete para cada interrupção:
A NIC usa o AMD para preencher buffers com dados recebidos e interrompe o sistema.
O driver de miniporta alocou os buffers de recebimento na memória compartilhada durante a inicialização.
A NIC pode preencher buffers de recebimento adicionais a qualquer momento, mas não interrompe novamente até que o driver de miniporta habilite as interrupções.
Os buffers recebidos que o sistema manipula em uma interrupção podem ser associados a muitas conexões de rede diferentes.
O NDIS chama a função MiniportInterrupt (ISR) do driver de miniport em uma CPU determinada pelo sistema.
O ISR desabilita as interrupções e solicita o NDIS para enfileirar uma DPC (chamada de procedimento adiado) para processar os dados recebidos.
O NDIS chama a função MiniportInterruptDPC (DPC) na CPU atual. No DPC:
- O driver de miniporta usa os valores de hash que a NIC calculou para cada buffer recebido e reatribui cada buffer recebido para uma fila de recebimento associada a uma CPU.
- O DPC atual solicita que o NDIS enfileira um DPC para cada uma das outras CPUs associadas a uma fila de recebimento não vazia.
- Se o DPC atual estiver em execução em uma CPU associada a uma fila não vazia, o DPC atual processará os buffers de recebimento associados e indicará os dados recebidos na pilha do driver.
Atribuir filas e enfileirar DPCs adicionais requer sobrecarga de processamento adicional. Para obter um melhor desempenho do sistema, essa sobrecarga deve ser deslocada pela melhor utilização de CPUs disponíveis.
O DPC em uma determinada CPU:
- Processa os buffers de recebimento associados à fila de recebimento e indica os dados na pilha do driver. Para obter mais informações, consulte Indicando que o RSS recebe dados.
- Habilita 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.