direct IO treats memory from user iovecs and memory from arrays of
kernel pages very differently. User memory is pinned and worked with in
batches while kernel pages are always pinned and don't require
additional processing.
Rather than try and provide an absctraction that includes these different
behaviours we let direct IO extract the memory structs and hand them to the
existing code.