Storport 队列管理

若要利用高性能存储适配器的功能,微型端口驱动程序必须控制其设备队列,以最大限度地提高效率的方式暂停和恢复这些队列。

在 SCSI 端口队列模型中,队列管理是端口驱动程序的独占域。 在 Storport 队列模型中,端口驱动程序提供多个队列管理支持例程,这些例程为微型端口驱动程序提供大量的队列管理控制。

在 Storport 队列模型中,所有请求都在每个逻辑单元队列的端口驱动程序中排队。 如果没有扩展的 SRB 支持,每个逻辑单元最多可以有 255 个未完成的请求。 否则,队列深度仅受可用系统资源或适配器功能的限制。 达到为队列深度设置的限制时,Storport 会保留对该逻辑单元的进一步请求,直到该单元的未完成请求数低于队列最大值。

对于适配器可以具有的未完成请求数,Storport 没有预定义的限制。 例如,附加了 55 个逻辑单元且队列深度为 255 的适配器一次最多可以发布 14,025 (55 x 255) 请求。 有关端口驱动程序的队列模型的说明,请参阅下图。

说明端口驱动程序的队列模型的示意图。

端口驱动程序的队列模型

如果适配器和逻辑单元都准备好接收请求,则系统按该顺序调用微型端口驱动程序的 HwStorBuildIoHwStorStartIo 例程。

与 SCSI 端口不同,Storport 允许微型端口驱动程序通知端口驱动程序繁忙情况。 这些通信由以下八个例程处理,这些例程允许微型端口驱动程序在逻辑单元或适配器暂停或繁忙时发出信号。

Storport 例程 已执行的操作

StorPortPauseDevice

将设备暂停指定的一段时间。

StorPortResumeDevice

恢复暂停的设备。

StorPortPause

将适配器暂停指定时间段。

StorPortResume

恢复暂停的适配器。

StorPortDeviceBusy

使设备忙碌,直到设备队列完成指定数量的 I/O 请求。

StorPortDeviceReady

让繁忙的设备准备好再次接收请求。

StorPortBusy

使适配器在完成指定数量的 I/O 请求之前保持忙碌状态。

StorPortReady

使繁忙的适配器准备好再次接收请求。

当设备暂停或繁忙时,端口驱动程序不会向设备发送任何请求。 如果微型端口驱动程序以忙状态 (SRB_STATUS_BUSY或SCSISTAT_BUSY) 完成请求,端口驱动程序将无限次重试该请求,直到请求失败或完成。

除了提供一组在 SCSI 端口队列模型中不可用的显式队列管理例程外,Storport 队列模型不使用 SCSI 端口采用的隐式队列管理例程。 具体而言,将忽略 NextRequestNextLuRequest 通知。