lkml.org 
[lkml]   [2015]   [Jan]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
SubjectRE: block layer copying user io vectors
Date
> > 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.


\
 
 \ /
  Last update: 2015-01-30 19:01    [W:0.067 / U:0.284 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site