播发 VMMQ 功能
微型端口驱动程序在微型端口适配器初始化期间 (NIC 的 VMMQ) 功能注册虚拟机多队列 。
注意
如果 NIC 支持 VMMQ,则默认 VPort 和至少一个非默认 VPort 必须支持 VMMQ。
在初始化期间,微型端口驱动程序必须检查 *RssOnHostVPorts INF 关键字 (keyword) ,以确定它是否应在 NIC 上启用 VMMQ 功能。 有关处理 VMMQ 的 RSS 关键字的详细信息,请参阅 VMMQ 的标准化 INF 关键字。
此外,仅当微型端口适配器支持创建 NIC 交换机时,堆栈才能激活 NIC 上的 VMMQ。 当 *SriovPreferred INF 关键字 (keyword) 设置为 1 或 *SriovPreferred 设置为零且 *RssOrVmqPreference 设置为 1 时,NDIS 可以在微型端口适配器上创建 NIC 开关。 有关详细信息,请参阅 SR-IOV 的标准化 INF 关键字 和 VMQ 的标准化 INF 关键字。
微型端口驱动程序配置 NIC 开关的参数时,必须按如下所示设置 NDIS_NIC_SWITCH_PARAMETERS 结构的字段:
将 Header 的 Revision 成员设置为 NDIS_NIC_SWITCH_PARAMETERS_REVISION_2。
将 NumQueuePairsForDefaultVPort 设置为分配给默认 VPort 的队列对数。
微型端口驱动程序通过 NDIS_NIC_SWITCH_CAPABILITIES 结构播发 NIC 的 VMMQ 功能。 微型端口驱动程序必须初始化 NDIS_NIC_SWITCH_CAPABILITIES ,如下所示:
将 Header 的 Revision 成员设置为 NDIS_NIC_SWITCH_CAPABILITIES_REVISION_3。
按如下所示设置 NicSwitchCapabilities 标志:
将 NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL设置为 1 ,以指示可以在 PF 上创建非默认 VPort。 必须设置此标志。
设置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。
注意
如果未设置以下四个每个 PF VPort 标志,则更高级别的驱动程序将使用在设置 PF VPort 的 RSS 参数时指定的值 (包括默认 VPort) 。 有关详细信息 ,请参阅在 VPort 上启用、禁用和更新 VMMQ。
- 将 NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_INDIRECTION_TABLE_SUPPORTED 设置为 1 以指示 NIC 能够维护每个 PF VPort 间接表。 必须设置此标志。
注意
以下三个标志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必须全部设置为 零 或全部设置为 1。 如果它们全部设置为 零,软件将重新计算哈希。
如果 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 VPort 的间接表大小有限制,请将NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_INDIRECTION_TABLE_SIZE_RESTRICTED设置为 1。 此标志强制 RSS OID 的颁发者使用每 PF VPort 间接表大小等于四舍五入到下一个幂的 VPort 队列数( 2)。 此标志可以与NDIS_NIC_SWITCH_CAPS_ASYMMETRIC_QUEUE_PAIRS_FOR_NONDEFAULT_VPORT_SUPPORTED标志结合使用, (不同的 PF VPort 可以具有不同数量的队列) 。 此标志阻止 VMMQ 用户执行细化队列引导。
设置 MaxNumVPorts 以指定最大 VPort 数。
设置 MaxNumQueuePairs 以指定可分配给所有 VPort 的最大队列对数。 这包括附加到 PF 的默认 VPort。 此数字应反映实际硬件功能。
设置 MaxNumQueuePairsPerNonDefaultVPort 以指定可分配给非默认 VPort 的最大队列对数。
设置 MaxNumRssCapableNonDefaultPFVPorts 以指定可支持 VMMQ 的非默认 PF VPort 的最大数目。
设置 NumberOfIndirectionTableEntriesForDefaultVPort 以指定默认 VPort 的间接表条目数。
设置 NumberOfIndirectionTableEntriesPerNonDefaultPFVPort 以指定每个非默认 PF VPort 的间接表条目数。 对于所有非默认 PF VPort,间接表的大小应相同。
设置 MaxNumQueuePairsForDefaultVPort 以指定在创建 NIC 交换机期间可分配给默认 VPort 的最大队列对数。
播发 VMMQ 功能后,在默认 VPort 或非默认 VPort 上调用 OID 时,NDIS 负责处理OID_GEN_RECEIVE_SCALE_CAPABILITIES OID。 当微型端口驱动程序返回 NDIS_RECEIVE_SCALE_CAPABILITIES 结构中的 RSS 功能时,它不应通过任何标准 RSS 关键字 ((如 *MaxRssProcessors) )来限制 NumberOfInterruptMessages 字段。 上层驱动程序会将此数字合并到主机 CPU 分配算法中。