MSI-X リソース フィルター処理

ミニポート ドライバーは、MSI X をサポートしており、かつ各 MSI-X メッセージの割り込みアフィニティを変更するか、メッセージ割り込みリソースを削除する場合、リソース要件フィルター関数を登録する必要があります。

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.InformationIO_RESOURCE_REQUIREMENTS_LIST 構造体としてリソース一覧を提供します。 一覧内のリソースは、IO_RESOURCE_DESCRIPTOR 構造体によって記述されます。

ミニポート ドライバーは、MSI-X メッセージを記述する CmResourceTypeInterrupt 型の各リソースの割り込みアフィニティ ポリシーを変更できます。 アフィニティ ポリシーが特定のプロセッサ セットの対象化を要求する場合、ミニポート ドライバーは、IO_RESOURCE_DESCRIPTOR 構造体の Interrupt.TargetedProcessorsKAFFINITY マスクも設定します。

ミニポート ドライバーは、メッセージ割り込みリソースである CmResourceTypeInterrupt 型のリソースをすべて削除できます。 その後、ドライバーは、MiniportInitializeEx 関数の行ベースの割り込みに登録できます。 ミニポート ドライバーがこれらのメッセージ割り込みリソースを削除しない場合、ドライバーが MiniportInitializeEx で行ベースの割り込みを登録しようとすると、オペレーティング システムは失敗します。

NDIS 6.1 以降のミニポート ドライバーは、リソース一覧にメッセージ割り込みリソースを追加できます。 たとえば、8 個の CPU を搭載したコンピューターで、NIC が 4 つの MSI-X メッセージを生成できる場合やオペレーティング システムで 4 つのメッセージ割り込みを有効にしている場合、オペレーティング システムはデバイスの MSI-X 構成空間で 4 つのメッセージ テーブル エントリを初期化し、リソース一覧に 4 つのメッセージ割り込みリソースを配置します。 この場合、ミニポート ドライバーはより多くのメッセージ割り込みリソースを必要とするため、リソース一覧にさらに 4 つのメッセージ割り込みリソースを割り当て、各 MSI-X メッセージのアフィニティを CPU に設定できます。 オペレーティング システムがより多くのメッセージ割り込みリソースを提供できる場合、ミニポート アダプターは開始時に 8 つのメッセージ割り込みリソースを受信します。 この場合、メッセージの番号は 0 から 7 です。

一覧の各メッセージ割り込みリソースには、一覧に表示される順序に対応するメッセージ番号が後で割り当てられます。 たとえば、一覧の最初のメッセージ割り込みリソースはメッセージ 0 に割り当てられ、2 番目のメッセージ割り込みリソースはメッセージ 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 を参照してください。