Skip to content

Commit f0f6b61

Browse files
author
Al Viro
committed
copy_page_to_iter(): don't split high-order page in case of ITER_PIPE
... just shove it into one pipe_buffer. Signed-off-by: Al Viro <[email protected]>
1 parent 310d9d5 commit f0f6b61

File tree

1 file changed

+6
-15
lines changed

1 file changed

+6
-15
lines changed

lib/iov_iter.c

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -706,30 +706,21 @@ static inline bool page_copy_sane(struct page *page, size_t offset, size_t n)
706706
return false;
707707
}
708708

709-
static size_t __copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
710-
struct iov_iter *i)
711-
{
712-
if (unlikely(iov_iter_is_pipe(i))) {
713-
return copy_page_to_iter_pipe(page, offset, bytes, i);
714-
} else {
715-
void *kaddr = kmap_local_page(page);
716-
size_t wanted = _copy_to_iter(kaddr + offset, bytes, i);
717-
kunmap_local(kaddr);
718-
return wanted;
719-
}
720-
}
721-
722709
size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
723710
struct iov_iter *i)
724711
{
725712
size_t res = 0;
726713
if (unlikely(!page_copy_sane(page, offset, bytes)))
727714
return 0;
715+
if (unlikely(iov_iter_is_pipe(i)))
716+
return copy_page_to_iter_pipe(page, offset, bytes, i);
728717
page += offset / PAGE_SIZE; // first subpage
729718
offset %= PAGE_SIZE;
730719
while (1) {
731-
size_t n = __copy_page_to_iter(page, offset,
732-
min(bytes, (size_t)PAGE_SIZE - offset), i);
720+
void *kaddr = kmap_local_page(page);
721+
size_t n = min(bytes, (size_t)PAGE_SIZE - offset);
722+
n = _copy_to_iter(kaddr + offset, n, i);
723+
kunmap_local(kaddr);
733724
res += n;
734725
bytes -= n;
735726
if (!bytes || !n)

0 commit comments

Comments
 (0)