Partilhar via


Filtragem de recursos MSI-X

Os drivers de miniporta devem registrar uma função de filtro de requisitos de recursos se oferecerem suporte a MSI-X e alterarão a afinidade de interrupção para cada mensagem MSI-X ou removerão recursos de interrupção de mensagem.

O NDIS chama a função MiniportFilterResourceRequirements depois que o NDIS recebe o IRP_MN_FILTER_RESOURCE_REQUIREMENTS (pacote de solicitação de I/O) para uma placa de interface de rede (NIC). O NDIS chama MiniportFilterResourceRequirements depois de os drivers de função subjacentes na pilha de dispositivos terem concluído o IRP.

O NDIS irá chamar MiniportFilterResourceRequirements após a função MiniportAddDevice retornar NDIS_STATUS_SUCCESS. O NDIS pode chamar MiniportFilterResourceRequirements novamente a qualquer momento antes de chamar MiniportRemoveDevice. O NDIS pode chamar MiniportFilterResourceRequirements enquanto a miniporta está em execução. Embora a miniporta possa modificar a lista de recursos conforme descrito abaixo, a miniporta não deve tentar usar imediatamente os novos recursos. O NDIS acabará por parar e reinicializar o miniporto com os novos recursos; só então o miniporto deve tentar usar os novos recursos.

IRP_MN_FILTER_RESOURCE_REQUIREMENTS fornece uma lista de recursos como uma estrutura IO_RESOURCE_REQUIREMENTS_LIST em Irp-IoStatus.Information>. Os recursos na lista são descritos por IO_RESOURCE_DESCRIPTOR estruturas.

Um driver de miniporta pode modificar a política de afinidade de interrupção para cada recurso do tipo CmResourceTypeInterrupt que descreve uma mensagem MSI-X. Se uma política de afinidade solicitar direcionamento para um conjunto específico de processadores, o driver de miniporta também definirá uma máscara KAFFINITY em Interrupt.TargetedProcessors na estrutura IO_RESOURCE_DESCRIPTOR.

Um driver de miniporta pode remover todos os recursos do tipo CmResourceTypeInterrupt que são recursos de interrupção de mensagem. O driver pode então registar-se para interrupções baseadas em linha na função MiniportInitializeEx. Se o driver de miniporta não remover esses recursos de interrupção de mensagem, o sistema operacional falhará se o driver tentar registrar interrupções baseadas em linha em MiniportInitializeEx.

Um driver de miniporta NDIS 6.1 ou posterior pode adicionar recursos de interrupção de mensagem à lista de recursos. Por exemplo, em um computador com oito CPUs, se a NIC puder gerar quatro mensagens MSI-X e se o sistema operacional habilitar as quatro interrupções de mensagem, o sistema operacional inicializará quatro entradas de tabela de mensagens no espaço de configuração MSI-X do dispositivo e colocará quatro recursos de interrupção de mensagem na lista de recursos. Nesse caso, como o driver de miniporta requer mais recursos de interrupção de mensagem, ele pode alocar mais quatro recursos de interrupção de mensagem para a lista de recursos e definir a afinidade de cada mensagem MSI-X para uma CPU. Se o sistema operacional puder fornecer mais recursos de interrupção de mensagem, o adaptador de miniporta receberá oito recursos de interrupção de mensagem quando for iniciado. Neste caso, as mensagens têm números de 0 a 7.

A cada recurso de interrupção de mensagem na lista é atribuído um número de mensagem posteriormente que corresponde à ordem em que aparece na lista. Por exemplo, os recursos de interrupção da primeira mensagem na lista são atribuídos à mensagem 0, a segunda é atribuída à mensagem 1 e assim por diante.

Para atribuir uma entrada de tabela MSI-X a uma CPU em tempo de execução, o driver de miniporta pode chamar a função NdisMConfigMSIXTableEntry, que associa uma entrada de tabela a uma mensagem de MSI-X que já tem a afinidade definida para a CPU. Para obter mais informações sobre operações de configuração para entradas de tabela MSI-X, consulte Alteração da afinidade da CPU das entradas de tabela MSI-X.

Para alocar memória para uma nova lista de requisitos de recursos, use a função NdisAllocateMemoryWithTagPriority . Você pode liberar a memória para a antiga lista de requisitos de recursos com a função NdisFreeMemory .

Os drivers de miniporta não devem modificar outros recursos, como recursos CmResourceTypeMemory e CmResourceTypePort . Os drivers de miniporta devem evitar adicionar um novo recurso à lista de recursos. No entanto, os drivers de miniporta NDIS 6.1 e posteriores podem adicionar mais recursos de interrupção de mensagem. Se o driver de miniporta adicionar mais recursos de interrupção de mensagem, ele não deve removê-los da função MiniportStartDevice .

Para obter mais informações sobre como adicionar e remover recursos, consulte IRP_MN_FILTER_RESOURCE_REQUIREMENTS.