Message ID | 1333530531.18626.550.camel@edumazet-glaptop |
---|---|
State | Not Applicable, archived |
Delegated to: | David Miller |
Headers | show |
On Wed, Apr 04 2012, Eric Dumazet wrote: > 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. Sorry for the slow reply on this one. It's been a long time since I wrote that code... If I recall correctly, the reason it currently requires alignment, is that a gifted page is no longer yours, by definition. So the alignment check was to ensure that we gift full pages. But if the caller screws that up, I guess it's the callers problem and it's a shame to limit the API in this way. I will apply it for 3.5.
On Fri, 2012-04-20 at 10:19 +0200, Jens Axboe wrote: > On Wed, Apr 04 2012, Eric Dumazet wrote: > > 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. > > Sorry for the slow reply on this one. It's been a long time since I > wrote that code... If I recall correctly, the reason it currently > requires alignment, is that a gifted page is no longer yours, by > definition. So the alignment check was to ensure that we gift full > pages. But if the caller screws that up, I guess it's the callers > problem and it's a shame to limit the API in this way. > > I will apply it for 3.5. > Thanks Jens -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/splice.c b/fs/splice.c index 5f883de..5417aa3 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -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, unsigned int nr_vecs, struct page **pages, - struct partial_page *partial, int aligned, + struct partial_page *partial, bool aligned, unsigned int pipe_buffers) { int buffers = 0, error = 0; @@ -1623,7 +1623,7 @@ static long vmsplice_to_pipe(struct file *file, const struct iovec __user *iov, return -ENOMEM; spd.nr_pages = get_iovec_page_array(iov, nr_segs, spd.pages, - spd.partial, flags & SPLICE_F_GIFT, + spd.partial, false, pipe->buffers); if (spd.nr_pages <= 0) ret = spd.nr_pages;
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> --- fs/splice.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html