On Fri, Jan 30, 2015 at 05:43:04PM +0000, Andy Falanga (afalanga) wrote:
quoted
quoted
This function does something that seems rather strange. On line 859,
a for loop determines the number of pages needed for the copying of
the user data to kernel space. Then the memory is allocated (line
886 bio_kmalloc()). Then, strangely, on line 895, there is this
conditional:
This is because the function can also be used with preallocated pages,
a feature only used by the sg and tape drivers.
Make sure your user memory is 4k aligned, and you should be able to
avoid the copy entirely (1).
Where is this 4k alignment being enforced? When sg_start_req calls to
blk_rq_map_user_iov, the only check for alignment is that the data buffers
are 4-byte aligned (q->dma_alignment == 3). I have verified that they are.
Indeed, I though we had the more strict direct I/O alignment.
Still doesn't help because the sg driver refuses to directly map user
pages for vectored I/O.