SCSI 微型端口驱动程序的 HwScsiTimer 例程

由于通过轮询管理所有 HBA I/O 操作而没有 HwScsiInterrupt 例程的微型端口驱动程序应具有 HwScsiTimer例程。 但是,具有 HwScsiInterrupt 例程的微型端口驱动程序通常也具有 HwScsiTimer 例程。

虽然微型端口驱动程序可以调用 ScsiPortStallExecution 以等待 HBA 上的状态更改,但微型端口驱动程序 绝不 应调用此例程来等待超过一毫秒,除非仅在微型端口驱动程序初始化时才执行的操作。 ScsiPortStallExecution 在给定的时间间隔内将处理器绑定起来,从而阻止系统中的其他代码执行有用的工作。

微型端口驱动程序应具有 HwScsiTimer 例程,而不是使用较大的输入间隔调用 ScsiPortStallExecution 并浪费许多 CPU 周期。 如果 HBA 未为每个操作生成完成中断,或者任何常见请求的操作(例如总线重置)花费的时间超过一毫秒,则一个或多个 HwScsiTimer 例程特别有用。

为此类操作对 HBA 进行编程后,微型端口驱动程序使用 NotificationTypeRequestTimerCall 调用 ScsiPortNotification、指向其 HBA 特定设备扩展的指针,其中包含有关操作的上下文、HwScsiTimer 入口点和驱动程序确定的间隔。

ScsiPortNotificationHwScsiTimer 例程的调用与 HwScsiInterrupt 例程的调用同步,以便在 HwScsiTimer 例程运行时无法并发执行。

对于对 ScsiPortNotification 的每次此类调用,HwScsiTimer 都会调用一次,可以从 HwScsiTimer 例程本身调用。 但是,使用 NotificationTypeRequestTimerCallScsiPortNotification 的任何调用都将替代指定间隔尚未过期的前面的调用。 也就是说,在任何给定时刻,只有一个未完成的请求调用微型端口驱动程序的 HwScsiTimer 例程。

传入 ScsiPortNotification 的间隔以微秒为单位,每次调用 HwScsiTimer 例程的最小开销约为 10 微秒。 输入间隔为零会取消上述调用 HwScsiTimer 例程的请求,前提是该请求尚未调用或调度以在基于 NT 的 SMP 计算机中的另一个处理器上执行。