Storport enables more effective miniport functioning in several ways. One is to circumvent the problem of delayed interrupt processing during miniport processing of the I/O; the other is to eliminate the need for stepwise building of scatter/gather lists.
Offloaded Build at Low IRQL
Prior to sending a command to the hardware, a miniport driver used with SCSIport must perform all build work during its StartIo routine. This means not only that start I/O and interrupts must be synchronized, but also that all processing occurs at an elevated IRQ level. The net result, when additional build work is required can be dramatically slow I/O processing.
In Storport, a new routine called HwBuildIo has been added to handle much of this preparatory work before the command is sent to the hardware. The Storport HwBuildIo routine is designed to allow the miniport to do this build work at a lower IRQL (known as DISPATCH IRQL) than with SCSIport, and does it without the need for synchronization. Because this routine runs before the StartIo routine, and at a lower priority level, interrupts are enabled, allowing requests to be sent to the controller even as the controller processes other requests. The net result is faster I/O processing. Again, where necessary, synchronization can be forced by calling the StorPortSynchronizeAccess routine.
One of the operations typically handled in the HwBuildIo routine is building the scatter/gather lists that identify the memory ranges and physical addresses where each portion of a data buffer resides in memory. Rather than making multiple calls to the port driver for each individual element (typically each element is a single memory page1), Storport can pass the entire scatter/gather list to the miniport in one call. In comparison with SCSIport processing (Figure 5), this Storport single pass also cuts the time to process I/O. Figure 7 shows the joint effects of the Storport offloaded build, done at a lower IRQL, and the single pass scatter/gather list creation.
Figure 7. Storport I/O Processing with the New HwBuildIo Routine
The effect of the HwBuildIo routine in combination with Storport full-duplex processing is shown in Figure 8. Note that both the Start I/O and the build on different processors can overlap in time, and can also overlap ISRs. Compared with the original SCSIport design, I/O processing is considerably more effective.
Figure 8. Storport I/O Processing with Bidirectional Transport and HwBuildIo