Memory-mapped IO takes a different approach from direct IO to removing
the extra data copy performed by normal ("indirect") IO. With mmap-ed
IO the application calls the mmap() system call to memory map sg's reserved
buffer. The sg driver maintains one reserved buffer per file descriptor.
The default size of the reserved buffer is 32 KB and it can be changed
with the ioctl(SG_SET_RESERVED_SIZE). The mmap() system call only needs
to be called once prior
[1]
to doing mmap-ed IO. For more details on the mmap() see
Section 7.6. An application indicates that it wants mmap-ed on
a SCSI request by setting the SG_FLAG_MMAP_IO value in 'flags'.
Since there is only reserved buffer per sg file descriptor then only one
mmap-ed IO command can be active at one time. In order to perform command
queuing with mmap-ed IO, an application will need to open() multiple
file descriptors to the same SCSI device.
With mmap-ed IO the various status values and the sense buffer (if
required) are conveyed back to an application in the same fashion as
normal ("indirect") IO.
Mmap-ed has very low per command latency since the reserved buffer mapping
only needs to be done once per file descriptor. Also the reserved buffer
is set up by the sg driver to aid the efficient construction of the
internal scatter gather list used by the lower level (adapter) driver for
DMA purposes. This tends to be more efficient than the user memory that
direct IO requires the sg driver to process into an internal scatter
gather list. So on both these counts, mmap-ed IO has the edge over direct IO.