RSS 配置

若要获取 RSS 配置信息,过度配置驱动程序可以将 OID_GEN_RECEIVE_SCALE_CAPABILITIES 的 OID 查询发送到微型端口驱动程序。 在初始化期间,NDIS 还为 NDIS_BIND_PARAMETERS 结构中的过度协议驱动程序提供 RSS 配置信息。

覆盖驱动程序选择哈希函数、类型和间接寻址表。 若要设置这些配置选项,驱动程序会将 OID_GEN_RECEIVE_SCALE_PARAMETERS 的 OID 集请求发送到微型端口驱动程序。 过分的驱动程序还可以查询此 OID 以获取当前的 RSS 设置。 OID_GEN_RECEIVE_SCALE_PARAMETERS OID 的信息缓冲区包含指向 NDIS_RECEIVE_SCALE_PARAMETERS 结构的指针。

过度覆盖的驱动程序可以在 NIC 上禁用 RSS。 在这种情况下,驱动程序在 NDIS_RECEIVE_SCALE_PARAMETERS 结构的 Flags 成员中设置NDIS_RSS_PARAM_FLAG_DISABLE_RSS标志。 设置此标志后,微型端口驱动程序应忽略所有其他标志和设置,并在 NIC 上禁用 RSS。

NDIS 先处理OID_GEN_RECEIVE_SCALE_PARAMETERS,然后再将其传递给微型端口驱动程序,并根据需要更新微型端口适配器的 *RSS 标准化关键字 (keyword) 。 有关 RSS 关键字 (keyword) 的详细信息,请参阅 RSS 的标准化 INF 关键字

在收到 设置了NDIS_RSS_PARAM_FLAG_DISABLE_RSS 标志的OID_GEN_RECEIVE_SCALE_PARAMETERS集请求后,微型端口驱动程序应在初始化后将 NIC 的 RSS 状态设置为 NIC 的初始状态。 因此,如果微型端口驱动程序收到后续OID_GEN_RECEIVE_SCALE_PARAMETERS设置请求并清除了NDIS_RSS_PARAM_FLAG_DISABLE_RSS标志,则所有参数的值都应与微型端口驱动程序在初始化微型端口适配器后首次收到OID_GEN_RECEIVE_SCALE_PARAMETERS集请求后设置的值相同。

过度覆盖的驱动程序可以使用 OID_GEN_RECEIVE_HASH OID 在接收的帧上启用和配置哈希计算,而无需启用 RSS。 覆盖驱动程序还可以查询此 OID 以获取当前接收哈希设置。

OID_GEN_RECEIVE_HASH OID 的信息缓冲区包含指向 NDIS_RECEIVE_HASH_PARAMETERS 结构的指针。 对于设置的请求,OID 指定微型端口适配器应使用的哈希参数。 对于查询请求,OID 返回微型端口适配器正在使用的哈希参数。 对于支持 RSS 的驱动程序,此 OID 是可选的。

注意 如果启用了接收哈希计算,NDIS 会在启用 RSS 之前禁用接收哈希计算。 如果启用了 RSS,NDIS 会在启用接收哈希计算之前禁用 RSS。

微型端口驱动程序支持的所有微型端口适配器必须向所有后续协议绑定提供相同的哈希配置设置。 此 OID 还包括微型端口驱动程序或 NIC 必须用于哈希计算的密钥。 密钥的长度为 320 位 (40 字节) ,可以包含过分驱动程序选择的任何数据,例如随机字节流。

若要重新平衡处理负载,过度分配驱动程序可以设置 RSS 参数并修改间接寻址表。 通常,除间接表外,所有参数均保持不变。 但是,在初始化 RSS 后,过度覆盖的驱动程序可能会更改其他 RSS 初始化参数。 如有必要,微型端口驱动程序可以重置 NIC 硬件,以更改哈希函数、哈希密钥、哈希类型、基 CPU 数或用于为间接表编制索引的位数。

注意 过度覆盖的驱动程序可以随时设置这些参数。 这可能会导致无序接收指示。 支持 TCP 的微型端口驱动程序不需要清除此实例中的接收队列。

下图提供了间接寻址表的两个实例的示例内容。

说明 RSS 间接表的两个实例的内容的关系图,该表具有 4 个处理器配置和 64 个条目。

上图假定四个处理器配置,哈希值中使用的最低有效位数为 6 位。 因此,间接表包含 64 个条目。

在图中,表 A 列出了初始化后紧接间接寻址表中的值。 后来,随着正常流量负载的变化,处理器负载会变得不平衡。 过度分配的驱动程序检测到不平衡情况,并尝试通过定义新的间接表来重新平衡负载。 表 B 列出了新的间接寻址表值。 在表 B 中,CPU 2 的一些负载将转移到 CPU 1 和 CPU 3。

注意 当间接表发生更改时,在短时间内 (当前接收描述符队列) 处理时,数据包可以在错误的 CPU 上进行处理。 这是正常的暂时性情况。

间接寻址表的大小通常是系统中处理器数的 2 到 8 倍。

当微型端口驱动程序将数据包分发到 CPU 时,如果 CPU 过多,则分配负载所花费的工作量可能会变得过高。 在这种情况下,过度分配驱动程序应选择在其中进行网络数据处理的 CPU 子集。

在某些情况下,可用硬件接收队列的数量可能小于系统上的 CPU 数。 微型端口驱动程序必须检查间接寻址表,以确定要与硬件队列关联的 CPU 数。 如果间接寻址表中显示的不同 CPU 编号的总数超过 NIC 支持的硬件队列数,则微型端口驱动程序必须从间接表选取 CPU 编号的子集。 子集的数量等于硬件队列的数量。 微型端口驱动程序从 OID_GEN_RECEIVE_SCALE_PARAMETERS 获取 IndirectionTableSize 参数。 微型端口驱动程序指定 NumberOfReceiveQueues 值以响应OID_GEN_RECEIVE_SCALE_CAPABILITIES。