次の方法で共有


ハードウェア キューを使用した RSS

ハードウェア キューを使用する RSS は、単一のハードウェア受信キュー ソリューションで RSS に対するシステム パフォーマンスを向上させます。 ハードウェア キューをサポートする NIC は、受信データを複数の受信キューに割り当てます。 受信キューは CPU に関連付けられています。 NIC は、ハッシュ値と間接参照テーブルに基づいて、受信データを CPU に割り当てます。

次の図は、NIC 受信キューを使用した RSS を示しています。

Diagram illustrating RSS with NIC receive queuing.

図では、破線の矢印は受信処理の代替パスを表しています。 RSS は、初期 ISR 呼び出しを受け取る CPU を制御できません。 ドライバーはデータをキューに入れる必要がないため、正しい CPU で最初の DPC をすぐにスケジュールできます。

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

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

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

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

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

    3. CPU のバッファーをキューに入れ、ミニポート ドライバーにキューの割り当てを提供します。

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

    4. システムを中断します。

      システムが 1 回の割り込みで処理する受信バッファーは、CPU 間で分散されます。

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

  3. ミニポート ドライバーは、空でないキューを持つ各 CPU の遅延プロシージャ コール (DPC) をキューに入れるよう NDIS に要求します。

    ドライバーが割り込みを有効にする前に、すべての DPC が完了する必要があることに注意してください。 また、ISR は、処理するバッファーがない CPU で実行されている可能性があることに注意してください。

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

    1. キュー内のすべての受信バッファーの受信記述子をビルドし、ドライバー スタック上のデータを示します。

      詳細については、「RSS 受信データの表示」を参照してください。

    2. 最後に完了した DPC の場合、割り込みを有効にします。 この割り込みが完了し、プロセスが再び開始されます。 ドライバーは、完了する最後の DPC を識別するアトミック操作を使用する必要があります。 たとえば、ドライバーは、NdisInterlockedDecrement 関数を使用してアトミック カウンターを実装できます。