使用硬件队列的 RSS
与具有单个硬件接收队列解决方案的 RSS 相比,具有硬件队列的 RSS 提高了系统性能。 支持硬件队列的 NIC 将接收的数据分配给多个接收队列。 接收队列与 CPU 相关联。 NIC 根据哈希值和间接表将接收的数据分配给 CPU。
下图演示了具有 NIC 接收队列的 RSS。
在图中,虚线箭头表示接收处理的备用路径。 RSS 无法控制接收初始 ISR 调用的 CPU。 驱动程序不必对数据进行排队,因此可以立即在正确的 CPU 上计划初始 DPC。
以下过程针对每个中断重复:
The NIC:
使用 DMA 使用接收的数据填充缓冲区。
微型端口驱动程序在初始化期间在共享内存中分配接收缓冲区。
计算哈希值。
对 CPU 的缓冲区进行排队,并为微型端口驱动程序提供队列分配。
例如,在收到一定数量的数据包后,NIC 可能会循环步骤 1-3 和 DMA CPU 分配列表。 具体机制留给 NIC 设计。
中断系统。
系统在一次中断中处理的接收缓冲区在 CPU 之间分布。
NDIS 在系统确定的 CPU 上 (ISR) 调用微型端口驱动程序的 MiniportInterrupt 函数。
微型端口驱动程序请求 NDIS 对具有非空队列的每个 CPU (DPC) 排队延迟的过程调用。
请注意,在驱动程序启用中断之前,所有 DPC 都必须完成。 另请注意,ISR 可能在没有要处理的缓冲区的 CPU 上运行。
NDIS 为每个排队的 DPC 调用 MiniportInterruptDPC 函数。 给定 CPU 上的 DPC:
生成其队列中所有接收的缓冲区的接收描述符,并指示驱动程序堆栈上的数据。
有关详细信息,请参阅 指示 RSS 接收数据。
如果中断是最后一个要完成的 DPC,则启用中断。 此中断已完成,进程将再次启动。 驱动程序必须使用原子操作来标识要完成的最后一个 DPC。 例如,驱动程序可以使用 NdisInterlockedDecrement 函数来实现原子计数器。