diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-04-04 19:23:46 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-05-06 17:39:45 -0400 |
commit | 81055e584f9d743cb13dc7944923d817c20f089d (patch) | |
tree | 06213185809c19175258bdb12f07204c79368cea | |
parent | 6abd232274fd652e4a57f486d14e52ffee6f72e9 (diff) | |
download | linux-81055e584f9d743cb13dc7944923d817c20f089d.tar.bz2 |
optimize copy_page_{to,from}_iter()
if we'd ended up in the end of a segment, jump to the
beginning of the next one (iov_offset = 0, iov++),
rather than having the next primitive deal with that.
Ought to be folded back...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | mm/iov_iter.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/mm/iov_iter.c b/mm/iov_iter.c index 081e3273085b..fcdaaab438b6 100644 --- a/mm/iov_iter.c +++ b/mm/iov_iter.c @@ -74,6 +74,10 @@ size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, } kunmap(page); done: + if (skip == iov->iov_len) { + iov++; + skip = 0; + } i->count -= wanted - bytes; i->nr_segs -= iov - i->iov; i->iov = iov; @@ -152,6 +156,10 @@ size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes, } kunmap(page); done: + if (skip == iov->iov_len) { + iov++; + skip = 0; + } i->count -= wanted - bytes; i->nr_segs -= iov - i->iov; i->iov = iov; |