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


Обработка прерывания MSI

NDIS вызывает функцию MiniportMessageInterrupt, когда сетевой интерфейс карта (NIC) создает прерывание. Параметр MessageId в этой функции определяет сообщение MSI-X.

MiniportMessageInterrupt всегда должен возвращать значение TRUE после обработки прерывания, так как прерывания сообщения не являются общими.

Драйвер минипорта должен выполнять как можно меньше работы в своей функции MiniportMessageInterrupt . Драйвер должен отложить операции ввода-вывода на функцию MiniportMessageInterruptDpc , которая вызывается NDIS для завершения отложенной обработки прерывания.

Чтобы ставить в очередь дополнительные отложенные вызовы процедур (DPC) после возврата MiniportMessageInterrupt , драйвер мини-порта задает биты параметра TargetProcessors функции MiniportMessageInterrupt . Чтобы запросить дополнительные DPC из MiniportMessageInterrupt или MiniportMessageInterruptDPC, драйвер мини-порта может вызвать функцию NdisMQueueDpc .

Драйвер мини-порта может вызвать NdisMQueueDpc , чтобы запросить дополнительные DPC для других процессоров.

NDIS 6.1 и более поздних версий гарантирует, что DPC для различных сообщений, запланированных для одного ЦП, помещаются в очередь отдельно. Например, если драйвер мини-порта одновременно планирует два DPC на ЦП 1 (один DPC для сообщения 0, другой DPC для сообщения 1), два DPC помещаются в очередь для ЦП 1 (один DPC с сообщением 0, а другой DPC с сообщением 1).

NDIS также гарантирует, что DPC для одного и того же сообщения, запланированного на разных ЦП, помещаются в очередь отдельно. Например, если драйвер минипорта планирует два DPC (один DPC на ЦП 0 для сообщения 0 и один DPC на ЦП 1 для сообщения 0), два отдельных DPC помещаются в очередь на ЦП 0 и ЦП 1, оба для сообщения 0.