RSS 配置
若要获取 RSS 配置信息,上层驱动程序可以将 OID_GEN_RECEIVE_SCALE_CAPABILITIES 的 OID 查询发送到微型端口驱动程序。 NDIS 还会在初始化期间将 RSS 配置信息提供给 NDIS_BIND_PARAMETERS 结构中的协议驱动程序。
上层驱动程序会选择哈希函数、类型和间接表。 若要设置这些配置选项,驱动程序会将 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 标准化关键字。 有关 *RSS 关键字的详细信息,请参阅 RSS 的标准化 INF 关键字。
收到设置了 NDIS_RSS_PARAM_FLAG_DISABLE_RSS 标志的 OID_GEN_RECEIVE_SCALE_PARAMETERS 设置请求后,微型端口驱动程序应在初始化后将 NIC 的 RSS 状态设置为 NIC 的初始状态。 因此,如果微型端口驱动程序收到清除 NDIS_RSS_PARAM_FLAG_DISABLE_RSS 标志的后续 OID_GEN_RECEIVE_SCALE_PARAMETERS 设置请求,则所有参数都应具有在微型端口驱动程序在初始化微型端口适配器后首次收到 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 的微型端口驱动程序不需要清除此实例中的接收队列。
下图提供间接表的两个实例的示例内容。
上图假设采用四处理器配置,并且哈希值中使用的最小有效位数为 6 位。 因此,间接表包含 64 个条目。
在图中,表 A 在初始化后立即列出间接表中的值。 稍后,随着正常的流量负载变化,处理器负载变得不平衡。 上层驱动程序会定义新的间接表,以便检测不平衡条件,并尝试重新平衡负载。 表 B 列出了新的间接表值。 在表 B 中,CPU 2 中的某些负载将被移到 CPU 1 和 3。
注意 更改间接表时,在短时间内(正在处理当前接收描述符队列时),可以在错误的 CPU 上处理数据包。 这是正常的暂时性情况。
间接表的大小通常是系统中处理器数的两到八倍。
当微型端口驱动程序将数据包分发到 CPU 时,如果 CPU 过多,则分发负载所需的工作量可能会高得令人望而却步。 在这种情况下,上层驱动程序应选择在其中处理网络数据的 CPU 子集。
在某些情况下,可用硬件接收队列的数量可能小于系统上的 CPU 数。 微型端口驱动程序必须检查间接表,以确定要与硬件队列关联的 CPU 编号。 如果间接表中显示的不同 CPU 编号总数大于 NIC 支持的硬件队列数,则微型端口驱动程序必须从间接表中选取 CPU 编号的子集。 子集在数量上与硬件队列数相等。 微型端口驱动程序从 OID_GEN_RECEIVE_SCALE_PARAMETERS 获取 IndirectionTableSize 参数。 微型端口驱动程序指定 NumberOfReceiveQueues 值以响应 OID_GEN_RECEIVE_SCALE_CAPABILITIES。