VMMQ 機能の公開

ミニポート ドライバーは、ミニポート アダプターの 初期化中に NIC の仮想マシンの複数のキュー (VMMQ) 機能を登録します。

Note

NIC で VMMQ がサポートされている場合は、既定の VPort と、少なくとも 1 つの既定以外の VPort で VMMQ がサポートされている必要があります。

初期化中、ミニポート ドライバーは、NIC で VMMQ 機能を有効にする必要があるかどうかを判断するために、*RssOnHostVPorts INF キーワードを調べる必要があります。 VMMQ の RSS キーワードの処理の詳細については、「VMMQ の標準化された INF キーワード」を参照してください。

さらに、ミニポート アダプターが NIC スイッチの作成をサポートしている場合にのみ、スタックは NIC で VMMQ をアクティブ化できます。 NDIS は、*SriovPreferred INF キーワードが 1 に設定されている場合、または *SriovPreferred0 に設定され、*RssOrVmqPreference1 に設定されている場合に、ミニポート アダプターに NIC スイッチを作成できます。 詳細については、「 SR-IOV の標準化された INF キーワード」および 「VMQ の標準化された INF キーワード」を参照してください。

ミニポート ドライバーは、NIC スイッチのパラメーターを構成するときに、次のようにNDIS_NIC_SWITCH_PARAMETERS構造体のフィールドを設定する必要があります。

  1. HeaderRevision メンバーを NDIS_NIC_SWITCH_PARAMETERS_REVISION_2 に設定します。

  2. NumQueuePairsForDefaultVPort を、既定の VPort に割り当てられたキュー ペアの数に設定します。

ミニポート ドライバーは、NDIS_NIC_SWITCH_CAPABILITIES 構造を介して NIC の VMMQ 機能をアドバタイズします。 ミニポート ドライバーは、次のように NDIS_NIC_SWITCH_CAPABILITIES を初期化する必要があります。

  1. HeaderRevision メンバーを NDIS_NIC_SWITCH_CAPABILITIES_REVISION_3 に設定します。

  2. NicSwitchCapabilities フラグを次のように設定します。

    • NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL を 1 に設定して、既定以外の VPort を PF に作成できることを示します。 このフラグを設定する必要があります。

    • NDIS_NIC_SWITCH_CAPS_ASYMMETRIC_QUEUE_PAIRS_FOR_NONDEFAULT_VPORT_SUPPORTED を設定して、NDIS が各 VPort に任意の数の VMMQ キューを割り当てられることを示します それ以外の場合、既定以外のすべての VPort は、MaxNumQueuePairsPerNonDefaultVPort フィールドが定義するのと同じ最大数の VMMQ キューを持ちます。

    • NDIS_NIC_SWITCH_CAPS_RSS_ON_PF_VPORTS_SUPPORTED を 1 に設定して、NIC が PF VPort で VMMQ をサポートしていることを示します。

    Note

    各 PF VPort フラグに次の 4 つのいずれかが設定されていない場合、上位レベルのドライバーは、PF VPort (既定の VPort を含む) の RSS パラメーターが設定されるときに指定された値を使用します。 詳細については、「VPort でのVMMQ の有効化、無効化、および更新」を参照してください。

    • NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_INDIRECTION_TABLE_SUPPORTEDを 1 に設定して、NIC が PF VPort 間接テーブルごとに維持できることを示します。 このフラグを設定する必要があります。

    Note

    次の 3 つのフラグ NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_HASH_FUNCTION_SUPPORTED、NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_HASH_TYPE_SUPPORTED、NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_HASH_KEY_SUPPORTED はすべて 0 または 1 に設定する必要があります。 すべて 0 に設定されている場合、ソフトウェアはハッシュを再計算します。

    • NIC が PF VPort ごとに異なるハッシュ関数の設定をサポートしている場合は、NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_HASH_FUNCTION_SUPPORTED を 1 に設定します。

    • NIC が PF VPort ごとに異なるハッシュの種類の設定をサポートしている場合は、NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_HASH_TYPE_SUPPORTED を 1 に設定します。

    • NIC が PF VPort ごとに異なるソケット キーの設定をサポートしている場合は、NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_HASH_KEY_SUPPORTED を 1 に設定します。

    • NIC に PF VPorts の間接テーブル サイズに制限がある場合は、NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_INDIRECTION_TABLE_SIZE_RESTRICTED を 1 に設定します。 このフラグにより、RSS OID の発行者は、2 の次の累乗に切り上げられた VPort キューの数と同じ PF VPort 間接テーブル サイズを使用します。 このフラグは、NDIS_NIC_SWITCH_CAPS_ASYMMETRIC_QUEUE_PAIRS_FOR_NONDEFAULT_VPORT_SUPPORTED フラグと組み合わせることができます (異なる PF VPort に異なる数のキューを含めることができます)。 このフラグにより、VMMQ ユーザーはきめ細かいキュー ステアリングを実行できなくなります。

  3. MaxNumVPorts を設定して、VPort の最大数を指定します。

  4. MaxNumQueuePairs を設定して、すべての VPort に割り当てることができるキュー ペアの最大数を指定します。 これには、PF に接続されている既定の VPort が含まれます。 この数は、実際のハードウェア機能を反映している必要があります。

  5. MaxNumQueuePairsPerNonDefaultVPort を設定 して、既定以外の VPort に割り当てることができるキュー ペアの最大数を指定します。

  6. MaxNumRssCapableNonDefaultPFVPorts を設定して、VMMQ をサポートできる既定以外の PF VPort の最大数を指定します。

  7. NumberOfIndirectionTableEntriesForDefaultVPort を設定して、既定の VPort の間接テーブル エントリの数を指定します。

  8. NumberOfIndirectionTableEntriesPerNonDefaultPFVPort を設定 して、既定以外の PF VPort ごとに間接テーブル エントリの数を指定します。 間接テーブルのサイズは、既定以外のすべての PF VPort で同じである必要があります。

  9. MAXNumQueuePairsForDefaultVPort を設定 して、 NIC スイッチの作成時に既定の VPort に割り当てることができるキュー ペアの最大数を指定します。

VMMQ 機能がアドバタイズされた後、NDIS は、既定の VPort または既定以外の VPort で呼び出されたときに、OID_GEN_RECEIVE_SCALE_CAPABILITIES OID を処理する責任があります。 ミニポート ドライバーは、NDIS_RECEIVE_SCALE_CAPABILITIES 構造体の RSS 機能を返す場合、標準の RSS キーワード (*MaxRssProcessors など) によって NumberOfInterruptMessages フィールドを制限することはできません。 上位レベルのドライバーは、ホスト CPU 割り当てアルゴリズムにこの数を組み込みます。