非默认虚拟端口和 VMQ
默认 NIC 交换机是网络适配器的一个组件,它支持单根 I/O 虚拟化 (SR-IOV) 接口。 交换机始终将默认虚拟端口 (VPort) 附加到 PCI Express (PCIe) 物理功能 (PF) 。 交换机可以将一个或多个非默认 VPort 附加到 PF。 有关详细信息,请参阅 创建虚拟端口。
虚拟化堆栈在 Hyper-V 父分区的管理操作系统中运行。 此堆栈通过发出对象标识符 (OID) OID_NIC_SWITCH_CREATE_VPORT 方法请求来创建 VPort。 但是,堆栈创建的 VPort 数可能多于活动 PCIe 虚拟函数的数量, (VFs) 已通过 OID_NIC_SWITCH_ALLOCATE_VF的 OID 方法请求为其分配了资源。
如果在网络适配器上启用了 SR-IOV,则必须禁用完整的 VMQ 功能。 但是,附加到 PF 且未附加到 VF 的非默认 VPort 可以提供与虚拟机队列 (VMQ) 接口相同的功能。 以下几点讨论了 VPorts 如何为类似于 VMQ 的数据包传输提供硬件加速数据路径:
VMQ 通过媒体访问控制 (MAC) 硬件中的筛选来确定目标 VM。 这避免了在虚拟化堆栈中确定目标 VM 的开销。
从Windows Server 2012开始,虚拟化堆栈通过发出OID_RECEIVE_FILTER_SET_FILTER的 OID 方法请求,在 VPort 上配置接收筛选器。 对于此 OID 请求,虚拟化堆栈传递 NDIS_RECEIVE_FILTER_PARAMETERS 结构,该结构指定与虚拟网络适配器关联的 MAC 地址和虚拟 LAN (VLAN) 标识符。 与 VMQ 类似,它可以在 VPort 上配置多个 MAC 地址和 VLAN ID 对。 虚拟化堆栈还指定接收筛选器将设置为的目标 VPort。
SR-IOV 网络适配器根据通过 OID_RECEIVE_FILTER_SET_FILTER 请求指定的筛选条件执行类似的硬件筛选。 在 VPort 的硬件接收队列上收到数据包时,微型端口驱动程序在带外 (OOB 中指定源 VPort 标识符,) 数据包 NET_BUFFER_LIST 结构的数据。 虚拟化堆栈根据 VPort 标识符确定目标 VM,并将数据包指示到 VM 中运行的网络堆栈。
同样,虚拟化堆栈在传输数据包的 NET_BUFFER_LIST 结构的 OOB 数据中指定目标 VPort 标识符。 当驱动程序处理数据包的发送请求时,它会将数据包置于指定 VPort 的硬件传输队列中。
可以使用 NET_BUFFER_LIST_RECEIVE_FILTER_VPORT_ID 宏从数据包的 OOB 数据获取 VPort 标识符。
有关此过程的详细信息,请参阅 通过虚拟端口的数据包流。
有关 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 相关性和中断审查参数。 通过执行此操作,虚拟化堆栈可以配置类似于 VMQ 的基于中断的参数,用于中断和 DPC 并发。
例如,当 SR-IOV 网络适配器在配置为具有特定 CPU 相关性的 VPort 上接收数据包时,适配器会在指定的 CPU 上生成中断。 微型端口驱动程序指示接收到 NDIS 的数据包以及该 CPU 的虚拟化堆栈。
PF 微型端口驱动程序在调用 MiniportInitializeEx 的上下文中播发其 SR-IOV 功能。 驱动程序使用其功能初始化 NDIS_SRIOV_CAPABILITIES 结构,并调用 NdisMSetMiniportAttributes 来注册其功能。 有关详细信息,请参阅 确定 SR-IOV 功能。
NDIS_NIC_SWITCH_CAPABILITIES结构的以下成员会影响 VPort 的分配方式:
MaxNumVPorts,指定可在网络适配器上创建的 VPort 的最大数目。
MaxNumVF,指定可在网络适配器上分配的最大 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 成员中报告的相同值相同。 微型端口驱动程序必须保留一个 VPort,用作分配给 PF 的默认 VPort。 因此,可分配给 PF 并用于 VM 接收队列的非默认 VPort 的最大数目为 (MaxNumVPorts – 1) 。
注意
如果设置了此标志,则不会为 VF 分配保留非默认 VPort 的创建和分配。 因此,如果池已用尽可用 VPort,则可能会出现以下情况:可能无法为 VF 分配 VPort。
如果未设置NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL标志,则会为 VF 分配保留非默认 VPort 的创建和分配。 可以创建并分配给 PF 并用于 VM 接收队列的其他非默认 VPort 的最大数目 (MaxNumVPorts–MaxNumVFs) 。
有关 VMQ 的详细信息,请参阅 虚拟机队列 (VMQ) 。