Compartilhar via


Filtragem de recursos MSI-X

Os drivers de miniport devem registrar uma função de filtro de requisitos de recurso 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 mensagens.

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

O NDIS chamará MiniportFilterResourceRequirements depois que 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 o miniporto está em execução. Embora o miniporto possa modificar a lista de recursos conforme descrito abaixo, o miniporto não deve tentar usar imediatamente os novos recursos. O NDIS eventualmente interromperá e reinicializará o miniporto com os novos recursos; somente então o miniporto 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 estruturas IO_RESOURCE_DESCRIPTOR .

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 o direcionamento para um conjunto específico de processadores, o driver de miniporto 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. Em seguida, o driver pode se registrar 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 no 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 miniporto requer mais recursos de interrupção de mensagens, 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 mensagens, o adaptador de miniporto receberá oito recursos de interrupção de mensagem quando for iniciado. Nesse caso, as mensagens têm números de 0 a 7.

Cada recurso de interrupção de mensagem na lista recebe um número de mensagem posteriormente que corresponde à ordem que ele mostra na lista. Por exemplo, os primeiros recursos de interrupção de mensagem na lista são atribuídos à mensagem 0, o segundo é atribuído à 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 miniport pode chamar a função NdisMConfigMSIXTableEntry , que mapeia uma entrada de tabela para uma mensagem 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 Alterando a afinidade de CPU de 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 lista antiga de requisitos de recursos com a função NdisFreeMemory .

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

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