)
第三部分NetAdapterCx 接收端缩放RSS—— 同步机制、异构 CPU 支持与调试八、SynchronizeSetIndirectionEntries 与同步机制NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES 结构中的 SynchronizeSetIndirectionEntries 成员允许客户端驱动程序控制间接表条目移动操作的同步行为。当 SynchronizeSetIndirectionEntries 设置为 TRUE 时NetAdapterCx 保证在调用 EvtNetAdapterReceiveScalingSetIndirectionEntries 期间不会并发调用其他 RSS 回调函数。这简化了驱动程序在更新硬件间接表时的同步逻辑但可能会延长回调的执行时间。当设置为 FALSE 时驱动程序需要自行处理可能的并发访问。驱动程序开发者应根据硬件能力选择适当的设置- 如果硬件支持原子性地更新多个间接表条目建议将 SynchronizeSetIndirectionEntries 设置为 FALSE 以获得更好的性能。- 如果硬件每次只能处理一个条目的更新或者更新操作需要较长时间建议设置为 TRUE 以确保操作的正确性。九、异构 CPU 支持重要提示异构 CPU 支持是预发行功能可能在商业发布之前进行大幅修改。异构 CPU 系统使用具有不同时钟速度和功能的多种核心类型。与每个核心彼此相同的同质多处理器系统相比异构 CPU 系统可以更好地适应动态计算负载并使用更少的能源。从 WDK 预览版 25197 开始NetAdapterCx 通过有效利用各种核心类型提供异构 CPU 系统支持。在 RSS 运行时系统会根据客户端驱动程序接收的流量工作负载决定要使用的处理器。当接收的流量较少时更小、更高效的核心可以处理流量。当流量增多时需要更大且性能更高的核心来持续监测收到的数据包。若要选择加入异构系统支持系统管理员必须将 *RSSProfile 标准化 INF 关键字设置为 NdisRssProfileBalanced。这是异构系统的默认配置文件。若要允许系统确定要使用的最佳核心不能设置 RSS 高级关键字。异构系统也支持其他 RSS 配置文件。如果要控制系统上的 RSS 基处理器编号和 RSS 最大处理器编号等高级设置则应使用不同的 RSS 配置文件。还可以在同质 CPU 系统上使用 NdisRssProfileBalanced。在这种情况下系统决定要用于 RSS 的处理器。十、RSSv2 支持在 NDIS 6.80 中RSS 已升级到 RSS 版本 2RSSv2。RSSv2 通过提供按 VPort 分布来改进 RSS。RSSv2 的主要改进包括- 支持每个 VPort 独立配置 RSS 参数- 更灵活的间接表管理- 改进的处理器负载均衡能力对于 NetAdapterCx 客户端驱动程序RSSv2 的支持通过 NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES 结构中的相应标志进行广告。十一、驱动验证与调试NetAdapterCx 提供了内置的驱动程序验证支持帮助开发者确保 RSS 实现的正确性。在使用驱动程序验证程序进行测试时如果客户端驱动程序不遵循 RSS 相关的规则如修改只读字段、在不正确的时机修改索引等驱动程序验证程序会报告冲突并在测试设备上触发 bug 检查。建议的调试和验证方法1. 在开发阶段启用驱动程序验证程序的 RSS 相关检查。2. 测试各种电源状态转换场景确保 RSS 在 D0 状态正确启用在非 D0 状态正确禁用。3. 测试间接表更新场景验证在系统负载变化时间接表条目的正确移动。4. 对支持异构 CPU 的系统验证在不同流量负载下 RSS 是否正确选择不同类型的核心。十二、常见问题与注意事项1. 间接表管理驱动程序不应在启用或禁用 RSS 时清除或重置间接表。框架负责设置初始间接表状态。2. 回调执行上下文所有 RSS 回调都在 PASSIVE_LEVEL IRQL 执行驱动程序可以在回调中执行需要等待的操作。3. 电源管理RSS 回调只在驱动程序处于 D0 电源状态时才会被调用。驱动程序不需要在非 D0 状态处理 RSS 事件。4. 多队列支持RSS 要求 NIC 支持多个接收队列。间接表中的每个条目映射到一个接收队列每个接收队列通常对应一个中断向量和一个 CPU 核心。5. 哈希类型和协议类型驱动程序在 EvtNetAdapterReceiveScalingEnable 回调中接收 HashType 和 ProtocolType 参数需要根据这些参数配置硬件哈希引擎。6. 性能考虑间接表的大小影响 RSS 的负载均衡粒度。较大的间接表如 512 个条目允许更精细的负载分配但会增加硬件查找的开销。