Filtrage des ressources MSI-X
Les pilotes Miniport doivent inscrire une fonction de filtre des exigences de ressources s’ils prennent en charge MSI-X et modifient l’affinité d’interruption pour chaque message MSI-X ou suppriment les ressources d’interruption de message.
NDIS appelle la fonction MiniportFilterResourceRequirements après que NDIS a reçu le IRP_MN_FILTER_RESOURCE_REQUIREMENTS paquet de demandes d’E/S (IRP) d’une carte d’interface réseau. NDIS appelle MiniportFilterResourceRequirements une fois que les pilotes de fonction sous-jacents dans la pile de périphériques ont terminé l’IRP.
NDIS appelle MiniportFilterResourceRequirements une fois que la fonction MiniportAddDevice retourne NDIS_STATUS_SUCCESS. NDIS peut appeler à tout moment MiniportFilterResourceRequirements avant d’appeler MiniportRemoveDevice. NDIS peut appeler MiniportFilterResourceRequirements pendant l’exécution du miniport. Bien que le miniport puisse modifier la liste des ressources comme décrit ci-dessous, le miniport ne doit pas immédiatement essayer d’utiliser les nouvelles ressources. NDIS arrêtera et réin initialisera le miniport avec les nouvelles ressources ; ce n’est qu’alors que le miniport doit tenter d’utiliser les nouvelles ressources.
IRP_MN_FILTER_RESOURCE_REQUIREMENTS fournit une liste de ressources sous forme de structure IO_RESOURCE_REQUIREMENTS_LIST dans Irp-IoStatus.Information>. Les ressources de la liste sont décrites par IO_RESOURCE_DESCRIPTOR structures.
Un pilote miniport peut modifier la stratégie d’affinité d’interruption pour chaque ressource de type CmResourceTypeInterrupt qui décrit un message MSI-X. Si une stratégie d’affinité demande un ciblage pour un ensemble spécifique de processeurs, le pilote miniport définit également un masque KAFFINITY sur Interrupt.TargetedProcessors dans la structure IO_RESOURCE_DESCRIPTOR.
Un pilote miniport peut supprimer toutes les ressources de type CmResourceTypeInterrupt qui sont des ressources d’interruption de message. Le pilote peut ensuite s’inscrire pour les interruptions basées sur les lignes dans la fonction MiniportInitializeEx . Si le pilote miniport ne supprime pas ces ressources d’interruption de message, le système d’exploitation échoue si le pilote tente d’inscrire des interruptions basées sur les lignes dans MiniportInitializeEx.
Un pilote miniport NDIS 6.1 ou ultérieur peut ajouter des ressources d’interruption de message à la liste des ressources. Par exemple, sur un ordinateur avec huit processeurs, si la carte réseau peut générer quatre messages MSI-X et si le système d’exploitation active les quatre interruptions de message, le système d’exploitation initialise quatre entrées de table de messages dans l’espace de configuration MSI-X de l’appareil et place quatre ressources d’interruption de message dans la liste des ressources. Dans ce cas, étant donné que le pilote miniport nécessite davantage de ressources d’interruption de message, il peut allouer quatre ressources d’interruption de message supplémentaires à la liste des ressources et définir l’affinité de chaque message MSI-X sur un processeur. Si le système d’exploitation peut fournir davantage de ressources d’interruption de message, l’adaptateur miniport reçoit huit ressources d’interruption de message lorsqu’il est démarré. Dans ce cas, les messages ont des numéros de 0 à 7.
Un numéro de message est attribué ultérieurement à chaque ressource d’interruption de message de la liste qui correspond à l’ordre qu’elle affiche dans la liste. Par exemple, la première ressource d’interruption de message dans la liste est affectée au message 0, la seconde au message 1, et ainsi de suite.
Pour affecter une entrée de table MSI-X à un processeur au moment de l’exécution, le pilote miniport peut appeler la fonction NdisMConfigMSIXTableEntry , qui mappe une entrée de table à un message MSI-X dont l’affinité est déjà définie sur le processeur. Pour plus d’informations sur les opérations de configuration des entrées de table MSI-X, consultez Modification de l’affinité processeur des entrées de table MSI-X.
Pour allouer de la mémoire à une nouvelle liste de besoins en ressources, utilisez la fonction NdisAllocateMemoryWithTagPriority . Vous pouvez libérer la mémoire de l’ancienne liste des besoins en ressources avec la fonction NdisFreeMemory .
Les pilotes miniport ne doivent pas modifier d’autres ressources, telles que les ressources CmResourceTypeMemory et CmResourceTypePort . Les pilotes miniport doivent éviter d’ajouter une nouvelle ressource à la liste des ressources. Toutefois, les pilotes miniport NDIS 6.1 et versions ultérieures peuvent ajouter d’autres ressources d’interruption de message. Si le pilote miniport ajoute des ressources d’interruption de message, il ne doit pas les supprimer de la fonction MiniportStartDevice .
Pour plus d’informations sur l’ajout et la suppression de ressources, consultez IRP_MN_FILTER_RESOURCE_REQUIREMENTS.