使用硬件队列的 RSS

与具有单个硬件接收队列解决方案的 RSS 相比,具有硬件队列的 RSS 提高了系统性能。 支持硬件队列的 NIC 将接收的数据分配给多个接收队列。 接收队列与 CPU 相关联。 NIC 根据哈希值和间接表将接收的数据分配给 CPU。

下图演示了具有 NIC 接收队列的 RSS。

说明 RSS 与 NIC 接收队列的关系图。

在图中,虚线箭头表示接收处理的备用路径。 RSS 无法控制接收初始 ISR 调用的 CPU。 驱动程序不必对数据进行排队,因此可以立即在正确的 CPU 上计划初始 DPC。

以下过程针对每个中断重复:

  1. The NIC:

    1. 使用 DMA 使用接收的数据填充缓冲区。

      微型端口驱动程序在初始化期间在共享内存中分配接收缓冲区。

    2. 计算哈希值。

    3. 对 CPU 的缓冲区进行排队,并为微型端口驱动程序提供队列分配。

      例如,在收到一定数量的数据包后,NIC 可能会循环步骤 1-3 和 DMA CPU 分配列表。 具体机制留给 NIC 设计。

    4. 中断系统。

      系统在一次中断中处理的接收缓冲区在 CPU 之间分布。

  2. NDIS 在系统确定的 CPU 上 (ISR) 调用微型端口驱动程序的 MiniportInterrupt 函数。

  3. 微型端口驱动程序请求 NDIS 对具有非空队列的每个 CPU (DPC) 排队延迟的过程调用。

    请注意,在驱动程序启用中断之前,所有 DPC 都必须完成。 另请注意,ISR 可能在没有要处理的缓冲区的 CPU 上运行。

  4. NDIS 为每个排队的 DPC 调用 MiniportInterruptDPC 函数。 给定 CPU 上的 DPC:

    1. 生成其队列中所有接收的缓冲区的接收描述符,并指示驱动程序堆栈上的数据。

      有关详细信息,请参阅 指示 RSS 接收数据

    2. 如果中断是最后一个要完成的 DPC,则启用中断。 此中断已完成,进程将再次启动。 驱动程序必须使用原子操作来标识要完成的最后一个 DPC。 例如,驱动程序可以使用 NdisInterlockedDecrement 函数来实现原子计数器。