次の方法で共有


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

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

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

1 つの受信記述子キューでの RSS 処理を示す図。

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

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

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

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

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

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

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

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

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

  5. NDIS は、現在の CPU の ミニポートInterruptDPC 関数 (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 関数を使用してアトミック カウンターを実装できます。