メッセージ シグナル割り込みを使用した RSS

ミニポート ドライバーは、RSS のパフォーマンスを向上させるために、メッセージ シグナル割り込み (MSI) をサポートできます。 MSI を使用すると、NIC は、受信したデータを処理する CPU の割り込みを要求できます。 MSI の NDIS サポートの詳細については、「NDIS MSI-X」を参照してください。

次の図は、MSI-X を使用した RSS を示しています。

Diagram illustrating RSS with MSI-X in a network stack.

図では、破線の矢印は別の接続での処理を表しています。 MSI-X を使用した RSS によって、NIC は接続に対して正しい CPU を中断できます。

割り込みごとに次のプロセスが繰り返されます。

  1. NIC では、次のことが行われます。

    1. DMA を使用して、受信データでバッファーを埋めます。

      ミニポート ドライバーは、初期化中に共有メモリ内の受信バッファーを割り当てました。

    2. ハッシュ値を計算します。

    3. CPU のバッファーをキューに入れ、ミニポート ドライバーにキューの割り当てを提供します。 たとえば、NIC は手順 1 から 3 をループし、いくつかのパケットを受信した後に CPU 割り当ての一覧を DMA 転送できます。 具体的なメカニズムは、NIC の設計に任されています。

    4. MSI-X を使用すると、空でないキューに関連付けられている CPU が中断されます。

  2. NIC は、追加の受信バッファーを埋め、いつでもキューに追加できますが、ミニポート ドライバーがその CPU の割り込みを有効にするまで、その CPU を再度中断しません。

  3. NDIS は、現在の CPU でミニポート ドライバーの ISR (MiniportInterrupt) を呼び出します。

  4. ISR は現在の CPU の割り込みを無効にし、現在の CPU 上の DPC をキューに入れます。

    DPC が現在の CPU で実行されている間も、割り込みは他の CPU で引き続き発生する可能性があります。

  5. NDIS は、キューに入った各 DPC の MiniportInterruptDPC 関数を呼び出します。 各 DPC:

    1. キュー内のすべての受信バッファーの受信記述子をビルドし、ドライバー スタック上のデータを示します。 詳細については、「RSS 受信データの表示」を参照してください。
    2. 現在の CPU の割り込みを有効にします。 この割り込みが完了し、プロセスが再び開始されます。 他の DPC の進行状況を追跡するためにアトミック操作は必要ありません。