Compartilhar via


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.

Diagrama ilustrando 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:

  1. 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.

  2. 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.

  3. O NDIS chama a função MiniportInterrupt (ISR) do driver de miniport em uma CPU determinada pelo sistema.

  4. O ISR desabilita as interrupções e solicita o NDIS para enfileirar uma DPC (chamada de procedimento adiado) para processar os dados recebidos.

  5. O NDIS chama a função MiniportInterruptDPC (DPC) na CPU atual. No DPC:

    1. 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.
    2. 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.
    3. 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.

  6. O DPC em uma determinada CPU:

    1. 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.
    2. 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.