RSS с одной аппаратной получающей очередью

Мини-порты могут поддерживать RSS для сетевых адаптеров, поддерживающих вычисление хэша RSS и одну очередь дескриптора приема.

На следующем рисунке показана обработка RSS с одной очередью дескриптора приема.

схема, иллюстрирующая обработку RSS с одной очередью дескриптора приема.

На рисунке пунктирные стрелки представляют альтернативный путь как для обработки данных на стороне приема. RSS не может контролировать ЦП, получающий начальный вызов ISR.

В отличие от обработки получения без использования RSS, обработка получения с использованием RSS распределяется по нескольким ЦПУ. Кроме того, обработку для заданного подключения можно связать с заданным ЦП.

Следующий процесс повторяется для каждого прерывания:

  1. Сетевой адаптер использует DMA для заполнения буферов полученными данными и прерывания системы.

    Минипорт-драйвер выделил буферы приема в общей памяти во время инициализации.

  2. Сетевой адаптер может заполнять дополнительные буферы приема в любое время, но не прерывает работу до тех пор, пока драйвер минипортов не включит прерывания.

    Полученные буферы, которые система обрабатывает в одном прерывании, могут быть связаны с множеством различных сетевых подключений.

  3. NDIS вызывает функцию минипорта MiniportInterrupt (ISR) на определяемом системой процессоре.

  4. ISR отключает прерывания и запрашивает NDIS поставить в очередь отложенный вызов процедуры (DPC) для обработки полученных данных.

  5. NDIS вызывает функцию MiniportInterruptDPC (DPC) на текущем ЦП. В DPC:

    1. Минипорт-драйвер использует хэш-значения, вычисляемые сетевым адаптером для каждого полученного буфера, и переназначает каждый полученный буфер в очередь получения, связанную с ЦП.
    2. Текущий отложенный вызов процедур (DPC) запрашивает NDIS на постановку в очередь вызова DPC для каждого из других процессоров, связанных с непустой очередью приема.
    3. Если текущий DPC работает на ЦП, связанном с непустой очередью, текущий DPC обрабатывает связанные буферы приема и передает полученные данные по стеку драйверов.

    Назначение очередей и постановка в очередь дополнительных отложенных процедур требуют дополнительных затрат на обработку. Чтобы обеспечить улучшенную производительность системы, эти издержки должны быть смещаются более эффективной загрузкой доступных ЦП.

  6. DPC на заданном ЦП:

    1. Обрабатывает буферы получения, связанные с очередью получения, и передает данные вверх по стекам драйверов. Для получения дополнительной информации см. раздел Указание данных приёма RSS.
    2. Включает прерывания, если это последний DPC для завершения. Это прерывание завершено, и процесс начинается снова. Драйвер должен использовать атомарную операцию, чтобы определить, какой DPC завершился последним. Например, драйвер может использовать функцию NdisInterlockedDecrement для реализации атомарного счетчика.