MSI-X 资源筛选

如果微型端口驱动程序支持 MSI-X,并且将更改每个 MSI-X 消息的中断相关性,或者将删除消息中断资源,则必须注册资源要求筛选器函数。

NDIS 在 NDIS 收到网络接口卡 (NIC) ( IRP) 的IRP_MN_FILTER_RESOURCE_REQUIREMENTS I/O 请求数据包后,NDIS 调用 MiniportFilterResourceRequirements 函数。 NDIS 在设备堆栈中的基础函数驱动程序完成 IRP 后调用 MiniportFilterResourceRequirements

MiniportAddDevice 函数返回NDIS_STATUS_SUCCESS后,NDIS 将调用 MiniportFilterResourceRequirements。 在调用 MiniportRemoveDevice 之前,NDIS 可以随时再次调用 MiniportFilterResourceRequirements 当微型端口运行时,NDIS 可能会调用 MiniportFilterResourceRequirements 。 虽然微型端口可能会按如下所述修改资源列表,但微型端口不应立即尝试使用新资源。 NDIS 最终将停止并使用新资源重新初始化微型端口;只有这样,微型端口才应尝试使用新资源。

IRP_MN_FILTER_RESOURCE_REQUIREMENTSIrp-IoStatus.Information> 中以IO_RESOURCE_REQUIREMENTS_LIST结构的形式提供资源列表。 列表中的资源由 IO_RESOURCE_DESCRIPTOR 结构描述。

微型端口驱动程序可以修改描述 MSI-X 消息的每个 CmResourceTypeInterrupt 类型的资源的中断关联策略。 如果关联策略请求以特定处理器集为目标,微型端口驱动程序还会在IO_RESOURCE_DESCRIPTOR结构中的 Interrupt.TargetedProcessors 处设置 KAFFINITY 掩码。

微型端口驱动程序可以删除作为消息中断资源的所有 CmResourceTypeInterrupt 类型的资源。 然后,驱动程序可以在 MiniportInitializeEx 函数中注册基于行的中断。 如果微型端口驱动程序不删除这些消息中断资源,如果驱动程序尝试在 MiniportInitializeEx 中注册基于行的中断,操作系统将失败。

NDIS 6.1 或更高版本的微型端口驱动程序可以将消息中断资源添加到资源列表。 例如,在具有八个 CPU 的计算机上,如果 NIC 可以生成四条 MSI-X 消息,并且操作系统启用了四个消息中断,则操作系统会在设备的 MSI-X 配置空间中初始化四个消息表条目,并将四个消息中断资源放入资源列表中。 在这种情况下,由于微型端口驱动程序需要更多的消息中断资源,因此它可以向资源列表再分配四个消息中断资源,并将每个 MSI-X 消息的相关性设置为 CPU。 如果操作系统可以提供更多消息中断资源,则微型端口适配器在启动时会收到 8 个消息中断资源。 在本例中,消息的数字介于 0 到 7。

列表中的每个消息中断资源稍后都会分配一个消息编号,该消息号与它在列表中显示的顺序相对应。 例如,列表中的第一个消息中断资源分配给消息 0,第二个消息被分配给消息 1,依此而行。

若要在运行时将 MSI-X 表项分配给 CPU,微型端口驱动程序可以调用 NdisMConfigMSIXTableEntry 函数,该函数将表项映射到已将关联设置为 CPU 的 MSI-X 消息。 有关 MSI-X 表条目的配置操作的详细信息,请参阅 更改 MSI-X 表条目的 CPU 相关性

若要为新的资源要求列表分配内存,请使用 NdisAllocateMemoryWithTagPriority 函数。 可以使用 NdisFreeMemory 函数释放旧资源要求列表的内存。

微型端口驱动程序不应修改其他资源,例如 CmResourceTypeMemoryCmResourceTypePort 资源。 微型端口驱动程序应避免将新资源添加到资源列表。 但是,NDIS 6.1 及更高版本的微型端口驱动程序可以添加更多消息中断资源。 如果微型端口驱动程序添加了更多消息中断资源,则不得将其从 MiniportStartDevice 函数中删除。

有关添加和删除资源的详细信息,请参阅 IRP_MN_FILTER_RESOURCE_REQUIREMENTS