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


Фильтрация ресурсов MSI-X

Драйверы мини-портов должны зарегистрировать функцию фильтра требований к ресурсам, если они поддерживают MSI-X и изменяют сходство прерываний для каждого сообщения MSI-X или удаляют ресурсы прерываний сообщений.

NDIS вызывает функцию MiniportFilterResourceRequirements после того, как NDIS получит IRP_MN_FILTER_RESOURCE_REQUIREMENTS пакет запроса ввода-вывода (IRP) для сетевого интерфейса карта (NIC). NDIS вызывает MiniportFilterResourceRequirements после того, как базовые драйверы функций в стеке устройств завершили IRP.

NDIS вызовет MiniportFilterResourceRequirements после того, как функция MiniportAddDevice вернет NDIS_STATUS_SUCCESS. NDIS может снова вызвать MiniportFilterResourceRequirements в любое время перед вызовом MiniportRemoveDevice. NDIS может вызывать MiniportFilterResourceRequirements во время работы минипорта. Хотя мини-порт может изменить список ресурсов, как описано ниже, он не должен сразу пытаться использовать новые ресурсы. NDIS в конечном итоге остановит и повторно инициализирует мини-порт с новыми ресурсами; только в этом случае мини-порт попытается использовать новые ресурсы.

IRP_MN_FILTER_RESOURCE_REQUIREMENTS предоставляет список ресурсов в виде структуры IO_RESOURCE_REQUIREMENTS_LIST на сайте Irp-IoStatus.Information>. Ресурсы в списке описываются IO_RESOURCE_DESCRIPTOR структурами.

Драйвер мини-порта может изменить политику сходства прерываний для каждого ресурса типа CmResourceTypeInterrupt , описывающего сообщение MSI-X. Если политика сопоставления запрашивает нацеливание на определенный набор процессоров, драйвер мини-порта также устанавливает маску KAFFINITY в файле Interrupt.TargetedProcessors в структуре IO_RESOURCE_DESCRIPTOR.

Драйвер мини-порта может удалить все ресурсы типа CmResourceTypeInterrupt , которые являются ресурсами прерывания сообщений. Затем драйвер может зарегистрироваться для прерываний на основе строк в функции MiniportInitializeEx . Если драйвер мини-порта не удаляет эти ресурсы прерываний сообщений, операционная система завершится сбоем, если драйвер попытается зарегистрировать прерывания на основе строки в MiniportInitializeEx.

Драйвер мини-порта NDIS 6.1 или более поздней версии может добавлять ресурсы прерывания сообщений в список ресурсов. Например, на компьютере с восемью ЦП, если сетевой адаптер может создать четыре сообщения MSI-X и если операционная система включает четыре прерывания сообщений, операционная система инициализирует четыре записи таблицы сообщений в пространстве конфигурации MSI-X устройства и помещает четыре ресурса прерывания сообщений в список ресурсов. В этом случае, так как драйверу мини-порта требуется больше ресурсов прерывания сообщений, он может выделить еще четыре ресурса прерывания сообщений в списке ресурсов и задать сходство каждого сообщения MSI-X с ЦП. Если операционная система может предоставить больше ресурсов прерывания сообщений, адаптер мини-порта получает восемь ресурсов прерываний сообщений при запуске. В этом случае сообщения имеют числа от 0 до 7.

Каждому ресурсу прерывания сообщений в списке позже назначается номер сообщения, соответствующий порядку, который отображается в списке. Например, первый ресурс прерывания сообщения в списке назначается сообщению 0, второй — сообщению 1 и т. д.

Чтобы назначить запись таблицы MSI-X ЦП во время выполнения, драйвер мини-порта может вызвать функцию NdisMConfigMSIXTableEntry , которая сопоставляет запись таблицы с сообщением MSI-X, которое уже имеет сходство с ЦП. Дополнительные сведения об операциях конфигурации для записей таблицы MSI-X см. в статье Изменение сходства ЦП для записей таблиц MSI-X.

Чтобы выделить память для нового списка требований к ресурсам, используйте функцию NdisAllocateMemoryWithTagPriority . Вы можете освободить память для старого списка требований к ресурсам с помощью функции NdisFreeMemory .

Драйверы мини-портов не должны изменять другие ресурсы, такие как ресурсы CmResourceTypeMemory и CmResourceTypePort . Драйверы мини-портов не должны добавлять новый ресурс в список ресурсов. Однако драйверы минипорта NDIS 6.1 и более поздних версий могут добавлять дополнительные ресурсы прерывания сообщений. Если драйвер мини-порта добавляет дополнительные ресурсы прерывания сообщений, он не должен удалять их из функции MiniportStartDevice .

Дополнительные сведения о добавлении и удалении ресурсов см. в разделе IRP_MN_FILTER_RESOURCE_REQUIREMENTS.