MSI 割り込みの処理

NDIS は、ネットワーク インターフェイス カード (NIC) が割り込みを生成するときに、MiniportMessageInterrupt 関数を呼び出します。 この関数の MessageId パラメーターは、MSI-X メッセージを識別します。

メッセージ割り込みが共有されないため、割り込みを処理した後は、MiniportMessageInterrupt は常に TRUE を返す必要があります。

ミニポート ドライバーは、MiniportMessageInterrupt 関数での作業を最小限にする必要があります。 ドライバーは、MiniportMessageInterruptDpc 関数に I/O 操作を延期させる必要があります。NDIS はこの関数を呼び出して、遅延された割り込み処理を完了します。

MiniportMessageInterrupt が返された後に、追加の遅延プロシージャ コール (DPC) をキューに入れるには、ミニポート ドライバーは MiniportMessageInterrupt 関数の TargetProcessors パラメーターのビットを設定します。 MiniportMessageInterrupt または MiniportMessageInterruptDPC から追加の DPC を要求するには、ミニポート ドライバーは、NdisMQueueDpc 関数を呼び出します。

他のプロセッサーの追加の DPC を要求するには、ミニポート ドライバーは、NdisMQueueDpc を呼び出します。

NDIS 6.1 以降のバージョンでは、同じ CPU 用にスケジュールされているさまざまなメッセージの DPC が個別にキューに入れられることが保証されます。 たとえば、ミニポート・ドライバが CPU 1に同時に 2 つの DPC (1 つはメッセージ 0 の、もう 1 つはメッセージ 1 の DPC) をスケジュールした場合、CPU 1 では 2 つの DPC (1 つはメッセージ 0 の、もう 1 つはメッセージ 1 の DPC) がキューに入れられます。

また、NDIS では、異なる CPU でスケジュールされている同じメッセージの DPC が個別にキューに入れられることも保証されます。 たとえば、ミニポート ドライバーが 2 つの DPC (メッセージ 0 に対して、CPU 0 に 1 つとCPU 1 に 1 つの DPC) をスケジュールする場合、2 つの別個の DPC が、両方ともメッセージ 0 に対して CPU 0 と CPU 1 でキューに入れられます。