vmsplice: relax alignement requirements for SPLICE_F_GIFT
It seems there is no fundamental reason to limit vmsplice() SPLICE_F_GIFT to page aligned chunks. All helpers are prepared to cope with offsets in page. This limitation makes vmsplice() API very impractical in the zero-copy land. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Cc: Tom Herbert <therbert@google.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: David Miller <davem@davemloft.net> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Hugh Dickins <hughd@google.com> Cc: Changli Gao <xiaosuo@gmail.com> Cc: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
@@ -1385,7 +1385,7 @@ static long do_splice(struct file *in, loff_t __user *off_in,
|
|||||||
*/
|
*/
|
||||||
static int get_iovec_page_array(const struct iovec __user *iov,
|
static int get_iovec_page_array(const struct iovec __user *iov,
|
||||||
unsigned int nr_vecs, struct page **pages,
|
unsigned int nr_vecs, struct page **pages,
|
||||||
struct partial_page *partial, int aligned,
|
struct partial_page *partial, bool aligned,
|
||||||
unsigned int pipe_buffers)
|
unsigned int pipe_buffers)
|
||||||
{
|
{
|
||||||
int buffers = 0, error = 0;
|
int buffers = 0, error = 0;
|
||||||
@@ -1623,7 +1623,7 @@ static long vmsplice_to_pipe(struct file *file, const struct iovec __user *iov,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
spd.nr_pages = get_iovec_page_array(iov, nr_segs, spd.pages,
|
spd.nr_pages = get_iovec_page_array(iov, nr_segs, spd.pages,
|
||||||
spd.partial, flags & SPLICE_F_GIFT,
|
spd.partial, false,
|
||||||
pipe->buffers);
|
pipe->buffers);
|
||||||
if (spd.nr_pages <= 0)
|
if (spd.nr_pages <= 0)
|
||||||
ret = spd.nr_pages;
|
ret = spd.nr_pages;
|
||||||
|
Reference in New Issue
Block a user