Поделиться через


RSS с аппаратными очередями

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

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

Схема, иллюстрирующая RSS с очередями получения сетевого адаптера.

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

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

  1. Сетевой адаптер:

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

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

    2. Вычисляет хэш-значение.

    3. Помещает в очередь буфер для ЦП и предоставляет назначения очередей драйверу мини-порта.

      Например, сетевой адаптер может циклически выполнять шаги 1–3 и DMA со списком назначений ЦП после получения некоторого количества пакетов. Конкретный механизм остается за проектированием сетевого адаптера.

    4. Прерывает работу системы.

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

  2. NDIS вызывает функцию MiniportInterrupt (ISR) драйвера miniport на системном ЦП.

  3. Драйвер мини-порта запрашивает NDIS для постановки в очередь отложенных вызовов процедур (DPCs) для каждого ЦП с непустой очередью.

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

  4. NDIS вызывает функцию MiniportInterruptDPC для каждого DPC в очереди. DPC на заданном ЦП:

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

      Дополнительные сведения см. в разделе Указание данных получения RSS.

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