> > 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. > > (1) except that the sg driver disables the direct mapping of user pages > when using readv/writev. I can't really see why and it should be > fixable by just removign that condition from the if in > sg_start_req. I am investigating this now. > Alternatively use the SG_IO ioctl directly on the disk device node, > which neither has the read/writev limitation, nor does it use > a fixed upper bound preallocated page pool. Unfortunately, the write/read interface of sg is what I need to use for asynchronous reasons. -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html