MSI-X-Ressourcenfilterung

Miniport-Treiber müssen eine Filterfunktion für Ressourcenanforderungen registrieren, wenn sie MSI-X unterstützen, und ändern die Interruptaffinität für jede MSI-X-Nachricht oder entfernen Nachrichtenunterbrechungsressourcen.

NDIS ruft die MiniportFilterResourceRequirements-Funktion auf, nachdem NDIS das IRP_MN_FILTER_RESOURCE_REQUIREMENTS E/A-Anforderungspaket (IRP) für eine Netzwerkschnittstelle Karte (NIC) empfangen hat. NDIS ruft MiniportFilterResourceRequirements auf, nachdem die zugrunde liegenden Funktionstreiber im Gerätestapel die IRP abgeschlossen haben.

NDIS ruft MiniportFilterResourceRequirements auf, nachdem die Funktion MiniportAddDevice NDIS_STATUS_SUCCESS zurückgegeben hat. NDIS kann MiniportFilterResourceRequirements jederzeit erneut aufrufen, bevor MiniportRemoveDevice aufgerufen wird. NDIS kann MiniportFilterResourceRequirements aufrufen, während der Miniport ausgeführt wird. Während der Miniport die Ressourcenliste wie unten beschrieben ändern kann, sollte der Miniport nicht sofort versuchen, die neuen Ressourcen zu verwenden. NDIS wird schließlich den Miniport mit den neuen Ressourcen anhalten und neu initialisieren; nur dann sollte der Miniport versuchen, die neuen Ressourcen zu verwenden.

IRP_MN_FILTER_RESOURCE_REQUIREMENTS stellt eine Ressourcenliste als IO_RESOURCE_REQUIREMENTS_LIST Struktur unter Irp-IoStatus.Information> bereit. Die Ressourcen in der Liste werden durch IO_RESOURCE_DESCRIPTOR-Strukturen beschrieben.

Ein Miniporttreiber kann die Interruptaffinitätsrichtlinie für jede Ressource vom Typ CmResourceTypeInterrupt ändern, die eine MSI-X-Nachricht beschreibt. Wenn eine Affinitätsrichtlinie eine bestimmte Gruppe von Prozessoren anfordert, legt der Miniporttreiber auch eine KAFFINITY-Maske auf Interrupt.TargetedProcessors in der IO_RESOURCE_DESCRIPTOR-Struktur fest.

Ein Miniporttreiber kann alle Ressourcen vom Typ CmResourceTypeInterrupt entfernen, die Nachrichtenunterbruchressourcen sind. Der Treiber kann dann für zeilenbasierte Interrupts in der MiniportInitializeEx-Funktion registrieren. Wenn der Miniporttreiber diese Nachrichtenunterbrechungsressourcen nicht entfernt, schlägt das Betriebssystem fehl, wenn der Treiber versucht, zeilenbasierte Interrupts in MiniportInitializeEx zu registrieren.

Ein NDIS 6.1- oder höher-Miniporttreiber kann der Ressourcenliste Nachrichtenunterbrechungsressourcen hinzufügen. Wenn die Netzwerkkarte beispielsweise auf einem Computer mit acht CPUs vier MSI-X-Nachrichten generieren kann und das Betriebssystem die vier Nachrichtenunterbrechungen aktiviert, initialisiert das Betriebssystem vier Nachrichtentabelleneinträge im MSI-X-Konfigurationsraum des Geräts und fügt vier Nachrichtenunterbrechungsressourcen in die Ressourcenliste ein. Da der Miniporttreiber in diesem Fall mehr Nachrichtenunterbrechungsressourcen erfordert, kann er der Ressourcenliste vier weitere Nachrichtenunterbrechungsressourcen zuordnen und die Affinität jeder MSI-X-Nachricht auf eine CPU festlegen. Wenn das Betriebssystem mehr Nachrichtenunterbrechungsressourcen bereitstellen kann, empfängt der Miniportadapter acht Nachrichtenunterbrechungsressourcen, wenn er gestartet wird. In diesem Fall weisen die Nachrichten Zahlen von 0 bis 7 auf.

Jeder Nachrichtenunterbrechungsressource in der Liste wird später eine Nachrichtennummer zugewiesen, die der Reihenfolge entspricht, die in der Liste angezeigt wird. Beispielsweise sind die ersten Nachrichtenunterbrechungsressourcen in der Liste Nachricht 0 zugewiesen, die zweite nachricht 1 usw.

Um einer CPU zur Laufzeit einen MSI-X-Tabelleneintrag zuzuweisen, kann der Miniporttreiber die Funktion NdisMConfigMSIXTableEntry aufrufen, die einen Tabelleneintrag einer MSI-X-Nachricht zuordnet, für die die Affinität zur CPU bereits festgelegt ist. Weitere Informationen zu Konfigurationsvorgängen für MSI-X-Tabelleneinträge finden Sie unter Ändern der CPU-Affinität von MSI-X-Tabelleneinträgen.

Verwenden Sie die Funktion NdisAllocateMemoryWithTagPriority , um Arbeitsspeicher für eine neue Ressourcenanforderungsliste zuzuweisen. Sie können den Arbeitsspeicher für die alte Ressourcenanforderungsliste mit der Funktion NdisFreeMemory freigeben.

Miniport-Treiber sollten keine anderen Ressourcen ändern, z. B. CmResourceTypeMemory - und CmResourceTypePort-Ressourcen . Miniport-Treiber sollten vermeiden, der Ressourcenliste eine neue Ressource hinzuzufügen. Miniporttreiber von NDIS 6.1 und höher können jedoch weitere Nachrichtenunterbrechungsressourcen hinzufügen. Wenn der Miniporttreiber weitere Nachrichtenunterbrechungsressourcen hinzufügt, dürfen sie nicht aus der MiniportStartDevice-Funktion entfernt werden.

Weitere Informationen zum Hinzufügen und Entfernen von Ressourcen finden Sie unter IRP_MN_FILTER_RESOURCE_REQUIREMENTS.