ハードウェア キューを備えた RSS は、単一のハードウェア受信キュー ソリューションを使用して RSS に対するシステム パフォーマンスを向上させます。 ハードウェア キューをサポートする NIC は、受信したデータを複数の受信キューに割り当てます。 受信キューは CPU に関連付けられています。 NIC は、ハッシュ値と間接テーブルに基づいて、受信したデータを CPU に割り当てます。
次の図は、NIC 受信キューを使用した RSS を示しています。
図では、破線の矢印は受信処理の代替パスを表しています。 RSS は、初期 ISR 呼び出しを受け取る CPU を制御できません。 ドライバーはデータをキューに入れる必要がないため、正しい CPU で初期 DPC をすぐにスケジュールできます。
割り込みごとに次のプロセスが繰り返されます。
The NIC:
DMA を使用して、受信したデータをバッファーに入力します。
ミニポート ドライバーは、初期化中に共有メモリ内の受信バッファーを割り当てた。
ハッシュ値を計算します。
CPU のバッファーをキューに入れ、ミニポート ドライバーにキューの割り当てを提供します。
たとえば、NIC は手順 1 から 3 をループし、いくつかのパケットを受信した後に CPU 割り当ての一覧を DMA でループできます。 具体的なメカニズムは、NIC の設計に任されています。
システムを中断します。
システムが 1 回の割り込みで処理する受信バッファーは、CPU 間で分散されます。
NDIS は、システムによって決定された CPU でミニポート ドライバーの ミニポートInterrupt 関数 (ISR) を呼び出します。
ミニポート ドライバーは、空でないキューを持つ各CPUごとに遅延プロシージャ呼び出し (DPC) をNDISに要求します。
ドライバーが割り込みを有効にする前に、すべての DPC が完了する必要があることに注意してください。 また、ISR は、処理するバッファーがない CPU で実行されている可能性があることに注意してください。
NDIS は、キューされた各 DPC に対して MiniportInterruptDPC 関数を呼び出します。 特定の CPU 上の DPC:
ビルドは、キュー内のすべての受信バッファーの記述子を受け取り、ドライバー スタック上のデータを示します。
詳細については、「 RSS 受信データを示す」を参照してください。
最後の DPC が完了した場合に、割り込みを有効にします。 この割り込みが完了し、プロセスが再び開始されます。 ドライバーは、完了する最後の DPC を特定するためにアトミック操作を用いる必要があります。 たとえば、ドライバーは 、NdisInterlockedDecrement 関数を使用してアトミック カウンターを実装できます。