diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-02-25 02:21:52 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-25 04:20:03 -0500 |
commit | 3255aa2eb636a508fc82a73fabbb8aaf2ff23c0f (patch) | |
tree | 2a602fb8f4fefe666e8daedf1e1f755800bd700a /mm/filemap.c | |
parent | 95f66b3770d6d0755b4a2d818c237574ffd74e4c (diff) |
x86, mm: pass in 'total' to __copy_from_user_*nocache()
Impact: cleanup, enable future change
Add a 'total bytes copied' parameter to __copy_from_user_*nocache(),
and update all the callsites.
The parameter is not used yet - architecture code can use it to
more intelligently decide whether the copy should be cached or
non-temporal.
Cc: Salman Qazi <sqazi@google.com>
Cc: Nick Piggin <npiggin@suse.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 23acefe51808..60fd56772cc6 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -1816,14 +1816,14 @@ EXPORT_SYMBOL(file_remove_suid); | |||
1816 | static size_t __iovec_copy_from_user_inatomic(char *vaddr, | 1816 | static size_t __iovec_copy_from_user_inatomic(char *vaddr, |
1817 | const struct iovec *iov, size_t base, size_t bytes) | 1817 | const struct iovec *iov, size_t base, size_t bytes) |
1818 | { | 1818 | { |
1819 | size_t copied = 0, left = 0; | 1819 | size_t copied = 0, left = 0, total = bytes; |
1820 | 1820 | ||
1821 | while (bytes) { | 1821 | while (bytes) { |
1822 | char __user *buf = iov->iov_base + base; | 1822 | char __user *buf = iov->iov_base + base; |
1823 | int copy = min(bytes, iov->iov_len - base); | 1823 | int copy = min(bytes, iov->iov_len - base); |
1824 | 1824 | ||
1825 | base = 0; | 1825 | base = 0; |
1826 | left = __copy_from_user_inatomic_nocache(vaddr, buf, copy); | 1826 | left = __copy_from_user_inatomic_nocache(vaddr, buf, copy, total); |
1827 | copied += copy; | 1827 | copied += copy; |
1828 | bytes -= copy; | 1828 | bytes -= copy; |
1829 | vaddr += copy; | 1829 | vaddr += copy; |
@@ -1851,8 +1851,9 @@ size_t iov_iter_copy_from_user_atomic(struct page *page, | |||
1851 | if (likely(i->nr_segs == 1)) { | 1851 | if (likely(i->nr_segs == 1)) { |
1852 | int left; | 1852 | int left; |
1853 | char __user *buf = i->iov->iov_base + i->iov_offset; | 1853 | char __user *buf = i->iov->iov_base + i->iov_offset; |
1854 | |||
1854 | left = __copy_from_user_inatomic_nocache(kaddr + offset, | 1855 | left = __copy_from_user_inatomic_nocache(kaddr + offset, |
1855 | buf, bytes); | 1856 | buf, bytes, bytes); |
1856 | copied = bytes - left; | 1857 | copied = bytes - left; |
1857 | } else { | 1858 | } else { |
1858 | copied = __iovec_copy_from_user_inatomic(kaddr + offset, | 1859 | copied = __iovec_copy_from_user_inatomic(kaddr + offset, |
@@ -1880,7 +1881,8 @@ size_t iov_iter_copy_from_user(struct page *page, | |||
1880 | if (likely(i->nr_segs == 1)) { | 1881 | if (likely(i->nr_segs == 1)) { |
1881 | int left; | 1882 | int left; |
1882 | char __user *buf = i->iov->iov_base + i->iov_offset; | 1883 | char __user *buf = i->iov->iov_base + i->iov_offset; |
1883 | left = __copy_from_user_nocache(kaddr + offset, buf, bytes); | 1884 | |
1885 | left = __copy_from_user_nocache(kaddr + offset, buf, bytes, bytes); | ||
1884 | copied = bytes - left; | 1886 | copied = bytes - left; |
1885 | } else { | 1887 | } else { |
1886 | copied = __iovec_copy_from_user_inatomic(kaddr + offset, | 1888 | copied = __iovec_copy_from_user_inatomic(kaddr + offset, |