Compartilhar via


Configuração do RSS

Para obter informações de configuração de RSS, um driver subjacente pode enviar uma consulta OID de OID_GEN_RECEIVE_SCALE_CAPABILITIES para um driver de miniporta. O NDIS também fornece as informações de configuração do RSS para drivers de protocolo subjacentes na estrutura NDIS_BIND_PARAMETERS durante a inicialização.

O driver subjacente escolhe uma função de hash, um tipo e uma tabela de indireção. Para definir essas opções de configuração, o driver envia uma solicitação de conjunto OID de OID_GEN_RECEIVE_SCALE_PARAMETERS para o driver da miniporta. Os drivers subjacentes também podem consultar esse OID para obter as configurações atuais de RSS. O buffer de informações para o OID OID_GEN_RECEIVE_SCALE_PARAMETERS contém um ponteiro para uma estrutura NDIS_RECEIVE_SCALE_PARAMETERS.

O driver subjacente pode desativar o RSS na NIC. Nesse caso, o driver define o sinalizador NDIS_RSS_PARAM_FLAG_DISABLE_RSS nos Sinalizadores membros da estrutura NDIS_RECEIVE_SCALE_PARAMETERS. Quando esse sinalizador é definido, o driver de miniporta deve ignorar todos os outros sinalizadores e configurações e desabilitar o RSS na NIC.

O NDIS processa OID_GEN_RECEIVE_SCALE_PARAMETERS antes de passá-lo para o driver de miniporta e atualiza a palavra-chave padronizada *RSS do adaptador de miniporta, se necessário. Para obter mais informações sobre a palavra-chave *RSS, consulte Palavras-chave INF padronizadas para RSS.

Depois de receber uma solicitação de conjunto de OID_GEN_RECEIVE_SCALE_PARAMETERS com o sinalizador NDIS_RSS_PARAM_FLAG_DISABLE_RSS definido, o driver de miniporta deve definir o estado RSS da NIC como o estado inicial da NIC após a inicialização. Portanto, se o driver de miniporta receber uma solicitação de conjunto de OID_GEN_RECEIVE_SCALE_PARAMETERS subsequente com o sinalizador de NDIS_RSS_PARAM_FLAG_DISABLE_RSS desmarcado, todos os parâmetros deverão ter os mesmos valores que foram definidos depois que o driver de miniporta recebeu a solicitação de conjunto de OID_GEN_RECEIVE_SCALE_PARAMETERS pela primeira vez após a inicialização do adaptador de miniporta.

Um driver subjacente pode usar o OID OID_GEN_RECEIVE_HASH para habilitar e configurar cálculos de hash em quadros recebidos sem habilitar o RSS. Os drivers subjacentes também podem consultar esse OID para obter as configurações de hash de recebimento atuais.

O buffer de informações para OID_GEN_RECEIVE_HASH OID contém um ponteiro para uma estrutura NDIS_RECEIVE_HASH_PARAMETERS. Para uma solicitação de conjunto, o OID especifica os parâmetros de hash que o adaptador de miniporta deve usar. Para uma solicitação de consulta, o OID retorna os parâmetros de hash que o adaptador de miniporta está usando. Esse OID é opcional para drivers que dão suporte a RSS.

Observação: se o cálculo de hash de recebimento estiver habilitado, o NDIS desabilitará o cálculo de hash de recebimento antes de habilitar o RSS. Se o RSS estiver habilitado, o NDIS desabilitará o RSS antes de habilitar o cálculo do hash de recebimento.

Todos os adaptadores de miniporta compatíveis com o driver de miniporta devem fornecer as mesmas definições de configuração de hash para todas as associações de protocolo subsequentes. Esse OID também inclui a chave secreta que o driver de miniporta ou a NIC deve usar para cálculos de hash. A chave tem 320 bits (40 bytes) e pode conter todos os dados que o driver subjacente escolher, por exemplo, um fluxo aleatório de bytes.

Para reequilibrar a carga de processamento, o driver subjacente pode definir os parâmetros RSS e modificar a tabela de indireção. Normalmente, todos os parâmetros permanecem inalterados, exceto a tabela de indireção. No entanto, depois que o RSS é inicializado, o driver subjacente pode alterar outros parâmetros de inicialização do RSS. Se necessário, o driver de miniporta pode redefinir o hardware da NIC para alterar a função de hash, a chave secreta de hash, o tipo de hash, o número da CPU base ou o número de bits usados para indexar a tabela de indireção.

Observação: o driver subjacente pode definir esses parâmetros a qualquer momento. Isso pode causar indicações de recebimento fora de ordem. Os drivers de miniporta que dão suporte ao TCP não são necessários para limpar suas filas de recebimento nessa instância.

A figura a seguir fornece um exemplo de conteúdo para duas instâncias da tabela de indireção.

Diagrama que ilustra o conteúdo de duas instâncias de uma tabela de indireção RSS com uma configuração de quatro processadores e 64 entradas.

A figura anterior pressupõe uma configuração de quatro processadores e o número de bits menos significativos usados do valor de hash é de 6 bits. Portanto, a tabela de indireção contém 64 entradas.

Na figura, a tabela A lista os valores na tabela de indireção imediatamente após a inicialização. Mais tarde, à medida que a carga de tráfego normal varia, a carga do processador fica desequilibrada. O driver subjacente detecta a condição desbalanceada e tenta reequilibrar a carga definindo uma nova tabela de indireção. A Tabela B lista os novos valores da tabela de indireção. Na tabela B, parte da carga da CPU 2 é movida para as CPUs 1 e 3.

Observação: quando a tabela de indireção é alterada, por um curto período de tempo (enquanto as filas do descritor de recebimento atuais estão sendo processadas), os pacotes podem ser processados na CPU errada. Esta é uma condição transitória normal.

O tamanho da tabela de indireção é normalmente de duas a oito vezes o número de processadores no sistema.

Quando o driver de miniporta distribui pacotes para CPUs, se houver muitas CPUs, o esforço gasto na distribuição da carga poderá se tornar proibitivo. Nesse caso, os drivers subjacentes devem escolher um subconjunto de CPUs no qual ocorre o processamento de dados de rede.

Em alguns casos, o número de filas de recebimento de hardware disponíveis pode ser menor que o número de CPUs no sistema. O driver de miniporta deve examinar a tabela de indireção para determinar os números de CPU a serem associados às filas de hardware. Se o número total de números de CPU diferentes que aparecem na tabela de indireção for maior do que o número de filas de hardware compatíveis com a NIC, o driver de miniporta deverá escolher um subconjunto dos números de CPU da tabela de indireção. O subconjunto é igual em número ao número de filas de hardware. O driver de miniporta obteve o parâmetro IndirectionTableSize de OID_GEN_RECEIVE_SCALE_PARAMETERS. O driver de miniporta especificou o valor NumberOfReceiveQueues em resposta a OID_GEN_RECEIVE_SCALE_CAPABILITIES.