単一ハードウェア受信キューを使用した RSS

ミニポート ドライバーは、RSS ハッシュ計算と単一の受信記述子キューをサポートする NIC の RSS をサポートできます。

次の図は、単一のの受信記述子キューでの RSS 処理を示しています。

Diagram illustrating RSS processing with a single receive descriptor queue.

図では、破線の矢印は受信処理の代替パスを表しています。 RSS は、初期 ISR 呼び出しを受け取る CPU を制御できません。

非 RSS の受信処理とは異なり、RSS ベースの受信処理は複数の CPU に分散されます。 また、特定の接続の処理は、特定の CPU に関連付けることができます。

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

  1. NIC は DMA を使用して受信データでバッファーを埋め、システムを中断します。

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

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

    システムが 1 回の割り込みで処理する受信バッファーは、さまざまなネットワーク接続に関連付けることができます。

  3. NDIS は、システムによって決定された CPU でミニポート ドライバーの MiniportInterrupt 関数 (ISR) を呼び出します。

  4. ISR は割り込みを無効にし、受信したデータを処理するために遅延プロシージャ コール (DPC) をキューに入れるよう NDIS に要求します。

  5. NDIS は、現在の CPU の MiniportInterruptDPC 関数 (DPC) を呼び出します。 DPC で以下を行ないます。

    1. ミニポート ドライバーは、受信した各に対して NIC が計算したハッシュ値を使用し、受信した各バッファーを CPU に関連付けられている受信キューに再割り当てします。
    2. 現在の DPC は、空でない受信キューに関連付けられている他の各 CPU の DPC をキューに入れるよう NDIS に要求します。
    3. 現在の DPC が空でないキューに関連付けられている CPU で実行されている場合、現在の DPC は、関連付けられている受信バッファーを処理し、ドライバー スタック上の受信データを示します。

    キューを割り当て、追加の DPC をキューに登録するには、追加の処理オーバーヘッドが必要です。 システムのパフォーマンスを向上させるには、使用可能な CPU の使用率を上げることで、このオーバーヘッドを相殺する必要があります。

  6. 特定の CPU 上の DPC:

    1. 受信キューに関連付けられている受信バッファーを処理し、ドライバー スタック上のデータを示します。 詳細については、「RSS 受信データの表示」を参照してください。
    2. 最後に完了した DPC の場合、割り込みを有効にします。 この割り込みが完了し、プロセスが再び開始されます。 ドライバーは、完了する最後の DPC を識別するアトミック操作を使用する必要があります。 たとえば、ドライバーは、NdisInterlockedDecrement 関数を使用してアトミック カウンターを実装できます。