MSI-X 資源篩選
如果迷你埠驅動程式支援 MSI-X,而且會變更每個 MSI-X 訊息的中斷親和性,或會移除訊息中斷資源,則迷你埠驅動程式必須註冊資源需求篩選函式。
NDIS 會在 NDIS 收到網路介面卡 ( NIC) 的 IRP_MN_FILTER_RESOURCE_REQUIREMENTS I/O 要求封包 (IRP) 之後,呼叫MiniportFilterResourceRequirements函式。 NDIS 會在裝置堆疊中的基礎函式驅動程式完成 IRP 之後,呼叫 MiniportFilterResourceRequirements 。
NDIS 會在MiniportAddDevice函式傳回NDIS_STATUS_SUCCESS之後呼叫MiniportFilterResourceRequirements。 NDIS 可能會在呼叫MiniportRemoveDevice之前,隨時再次呼叫MiniportFilterResourceRequirements。 NDIS 可能會在迷你埠執行時呼叫 MiniportFilterResourceRequirements 。 雖然迷你埠可能會如下所示修改資源清單,但迷你埠不應立即嘗試使用新的資源。 NDIS 最終會停止,並使用新的資源重新初始化迷你埠;只有之後,迷你埠才會嘗試使用新的資源。
IRP_MN_FILTER_RESOURCE_REQUIREMENTS會在Irp-IoStatus.Information >提供資源清單做為IO_RESOURCE_REQUIREMENTS_LIST結構。 清單中的資源是由 IO_RESOURCE_DESCRIPTOR 結構所描述。
迷你埠驅動程式可以針對描述 MSI-X 訊息之 CmResourceTypeInterrupt 類型的每個資源修改中斷親和性原則。 如果親和性原則要求以特定處理器集為目標,迷你埠驅動程式也會在 IO_RESOURCE_DESCRIPTOR 結構中的Interrupt.TargetedProcessors上設定KAFFINITY遮罩。
迷你埠驅動程式可以移除屬於訊息中斷資源之 CmResourceTypeInterrupt 類型的所有資源。 驅動程式接著可以在 MiniportInitializeEx 函式中註冊以行為基礎的中斷。 如果迷你埠驅動程式未移除這些訊息中斷資源,如果驅動程式嘗試在 MiniportInitializeEx中註冊以行為基礎的中斷,作業系統將會失敗。
NDIS 6.1 或更新版本的迷你埠驅動程式可以將訊息中斷資源新增至資源清單。 例如,在具有八個 CPU 的電腦上,如果 NIC 可以產生四個 MSI-X 訊息,而且作業系統啟用四個訊息中斷,則作業系統會在裝置的 MSI-X 組態空間中初始化四個訊息資料表專案,並在資源清單中放置四個訊息中斷資源。 在此情況下,因為迷你埠驅動程式需要更多訊息中斷資源,所以可以將四個以上的訊息中斷資源配置給資源清單,並將每個 MSI-X 訊息的親和性設定為 CPU。 如果作業系統可以提供更多訊息中斷資源,迷你埠配接器會在啟動時收到八個訊息中斷資源。 在此情況下,訊息具有 0 到 7 的數位。
清單中每個訊息中斷資源會指派一個訊息編號,以對應到清單中顯示的順序。 例如,清單中的第一個訊息中斷資源會指派給訊息 0、第二個訊息被指派給訊息 1 等等。
若要在執行時間將 MSI-X 資料表專案指派給 CPU,迷你埠驅動程式可以呼叫 NdisMConfigMSIXTableEntry 函式,此函式會將資料表專案對應至已設定為 CPU 的 MSI-X 訊息。 如需 MSI-X 資料表專案之設定作業的詳細資訊,請參閱 變更 MSI-X 資料表專案的 CPU 親和性。
若要為新的資源需求清單配置記憶體,請使用 NdisAllocateMemoryWithTagPriority 函式。 您可以使用 NdisFreeMemory 函式釋放舊資源需求清單的記憶體。
迷你埠驅動程式不應修改其他資源,例如 CmResourceTypeMemory 和 CmResourceTypePort 資源。 迷你埠驅動程式應該避免將新的資源新增至資源清單。 不過,NDIS 6.1 和更新版本的迷你埠驅動程式可以新增更多訊息中斷資源。 如果迷你埠驅動程式新增更多訊息中斷資源,它不得從 MiniportStartDevice 函式中移除它們。
如需新增和移除資源的詳細資訊,請參閱 IRP_MN_FILTER_RESOURCE_REQUIREMENTS。