既定以外の仮想ポートおよび VMQ

既定の NIC スイッチは、単一ルート I/O 仮想化 (SR-IOV) インターフェイスをサポートするネットワーク アダプターのコンポーネントです。 スイッチは、常に既定の仮想ポート (VPort) を PCI 簡易 (PCIe) 物理機能 (PF) にアタッチします。 スイッチは、1 つ以上の既定以外の VPort を PF にアタッチできます。 詳細については、「仮想ポートの作成」を参照してください。

仮想化スタックは、Hyper-V 親パーティションの管理オペレーティング システムで実行されます。 このスタックは、OID_NIC_SWITCH_CREATE_VPORT のオブジェクト識別子 (OID) メソッド要求を発行することによって VPort を作成します。 ただし、スタックは、OID_NIC_SWITCH_ALLOCATE_VF の OID メソッド要求によってリソースが割り当てられているアクティブな PCIe Virtual Functions (VFs) の数よりも多くの VPort を作成できます。

ネットワーク アダプター上で SR-IOV が有効になっている場合は、完全な VMQ 機能を無効にする必要があります。 ただし、PF にアタッチされ、VF にアタッチされていない既定以外の VPort は、仮想マシン キュー (VMQ) インターフェイスと同じ機能を提供できます。 以下のポイントでは、VMQ と同様のパケット転送に対して、VPort がハードウェアで高速化されたデータ パスを提供する方法について説明します。

  • VMQ は、ハードウェアでのメディア アクセス制御 (MAC) フィルタリングによってターゲット VM を決定します。 これにより、仮想化スタック内のターゲット VM を決定するオーバーヘッドが回避されます。

    Windows Server 2012 以降、仮想化スタックは、OID_RECEIVE_FILTER_SET_FILTER の OID メソッド要求を発行することによって、VPort の受信フィルターを構成します。 この OID 要求に対して、仮想化スタックは、仮想ネットワーク アダプターに関連付けられている MAC アドレスと仮想 LAN (VLAN) 識別子を指定する NDIS_RECEIVE_FILTER_PARAMETERS 構造を渡します。 VMQ と同様に、VPort 上で複数の MAC アドレスと VLAN ID ペアを構成できます。 仮想化スタックは、受信フィルターを設定するターゲット VPort も指定します。

    SR-IOV ネットワーク アダプターは、OID_RECEIVE_FILTER_SET_FILTER 要求で指定されたフィルタリング条件に基づいて、同様のハードウェア フィルタリングを実行します。 パケットが VPort のハードウェア受信キューで受信されると、ミニポート ドライバーは、パケットの NET_BUFFER_LIST 構造の帯域外 (OOB) データのソース VPort 識別子を指定します。 仮想化スタックは、VPort 識別子に基づいてターゲット VM を決定し、VM で実行されるネットワーク スタックにパケットを指示します。

    同様に、仮想化スタックは、送信パケットの NET_BUFFER_LIST 構造の OOB データ内でターゲット VPort 識別子を指定します。 ドライバーは、パケットの送信要求を処理するときに、指定された VPort のハードウェア送信キューにパケットを配置します。

    VPort 識別子は、NET_BUFFER_LIST_RECEIVE_FILTER_VPORT_ID マクロを使用してパケットの OOB データから取得することができます。

    このプロセスの詳細については、「仮想ポート経由のパケット フロー」を参照してください。

    SR-IOV ネットワーク アダプターの受信フィルタリング要件の詳細については、「受信フィルタリング機能の決定」を参照してください。

  • VMQ は割り込みと DPC コンカレンシーを提供します。

    NDIS 6.30 および Windows Server 2012 以降では、PF に接続されている VPort を、特定の CPU アフィニティを持つよう構成できます。 仮想化スタックは、OID_NIC_SWITCH_CREATE_VPORT または OID_NIC_SWITCH_VPORT_PARAMETERS の OID メソッド要求を使用して、VPort の CPU アフィニティと割り込みモデレーション パラメーターを構成します。 これにより、仮想化スタックは、割り込みと DPC コンカレンシーのために VMQ と同様の割り込みベースのパラメーターを構成します。

    たとえば、SR-IOV ネットワーク アダプターが、特定の CPU アフィニティを持つ構成の VPort でパケットを受信すると、アダプターは指定された CPU で割り込みを生成します。 ミニポート ドライバーは、NDIS とその CPU の仮想化スタックに受信したパケットを示します。

PF ミニポート ドライバーは、MiniportInitializeEx への呼び出しのコンテキスト内で SR-IOV 機能をアドバタイズします。 ドライバーは、その機能を使用して NDIS_SRIOV_CAPABILITIES 構造を初期化し、NdisMSetMiniportAttributes を呼び出してその機能を登録します。 詳細については「SR-IOV の機能の決定」を参照してください 。

NDIS_NIC_SWITCH_CAPABILITIES 構造の以下のメンバーは、VPort の割り当て方法に影響します。

  • MaxNumVPorts。ネットワーク アダプターで作成できる VPort の最大数を指定します。

  • MaxNumVFs。ネットワーク アダプターに割り当てることができる VF の最大数を指定します。

NDIS 6.30 以降では、ミニポート ドライバーは、NDIS_NIC_SWITCH_CAPABILITIES 構造を初期化するときに、NicSwitchCapabilities メンバーに NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL フラグを設定できます。 このフラグは、ネットワーク アダプター上の VPort プールから、既定以外の VPort を予約されていない方法で作成できることを示します。 これにより、使用可能な既定以外の VPort を作成し、必要に応じて PF と割り当て済み VF に割り当てることができます。 ネットワーク アダプターが VMQ インターフェイスをサポートしている場合は、PF に割り当てられている既定以外の VPort も VM 受信キューに使用できます。

NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL フラグが設定されている場合、使用可能な既定以外の VPort が作成され、PF と割り当て済み VF に割り当てられます。 PF に作成して割り当てることができる VPort の最大数は、ドライバーが MaxNumVPorts メンバーで報告する値と同じです。 ミニポート ドライバーは、PF に割り当て済みの既定の VPort として使用する VPort を 1 つ予約する必要があります。 その結果、PF に割り当てることができ、VM 受信キューに使用できる既定以外の VPort の最大数は (MaxNumVPorts – 1) です。

Note

 このフラグが設定されている場合、既定以外の VPort の作成と割り当ては VF 割り当て用に予約されません。 その結果、使用可能な VPort がプールで使い果たされた場合、VF に VPort が割り当てられていない状況が発生する可能性があります。 

NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL フラグが設定されていない場合、既定以外の VPort の作成と割り当ては VF 割り当て用に予約されます。 VM 受信キューに使用できる、PF に作成して割り当て可能な既定以外の追加 VPorts の最大数は、VM 受信キューに使用できる既定以外の (MaxNumVPortsMaxNumVFs) です。

VMQ の詳細については、「仮想マシン キュー (VMQ)」を参照してください。