diff options
| -rw-r--r-- | arch/x86/include/asm/uaccess_32.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/asm/uaccess_64.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 2 | ||||
| -rw-r--r-- | include/linux/uaccess.h | 4 | ||||
| -rw-r--r-- | mm/filemap.c | 10 | ||||
| -rw-r--r-- | mm/filemap_xip.c | 2 |
6 files changed, 14 insertions, 13 deletions
diff --git a/arch/x86/include/asm/uaccess_32.h b/arch/x86/include/asm/uaccess_32.h index 5e06259e90e5..a0ba61386972 100644 --- a/arch/x86/include/asm/uaccess_32.h +++ b/arch/x86/include/asm/uaccess_32.h | |||
| @@ -157,7 +157,7 @@ __copy_from_user(void *to, const void __user *from, unsigned long n) | |||
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | static __always_inline unsigned long __copy_from_user_nocache(void *to, | 159 | static __always_inline unsigned long __copy_from_user_nocache(void *to, |
| 160 | const void __user *from, unsigned long n) | 160 | const void __user *from, unsigned long n, unsigned long total) |
| 161 | { | 161 | { |
| 162 | might_fault(); | 162 | might_fault(); |
| 163 | if (__builtin_constant_p(n)) { | 163 | if (__builtin_constant_p(n)) { |
| @@ -180,7 +180,7 @@ static __always_inline unsigned long __copy_from_user_nocache(void *to, | |||
| 180 | 180 | ||
| 181 | static __always_inline unsigned long | 181 | static __always_inline unsigned long |
| 182 | __copy_from_user_inatomic_nocache(void *to, const void __user *from, | 182 | __copy_from_user_inatomic_nocache(void *to, const void __user *from, |
| 183 | unsigned long n) | 183 | unsigned long n, unsigned long total) |
| 184 | { | 184 | { |
| 185 | return __copy_from_user_ll_nocache_nozero(to, from, n); | 185 | return __copy_from_user_ll_nocache_nozero(to, from, n); |
| 186 | } | 186 | } |
diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h index 987a2c10fe20..a748253db0c9 100644 --- a/arch/x86/include/asm/uaccess_64.h +++ b/arch/x86/include/asm/uaccess_64.h | |||
| @@ -189,7 +189,7 @@ extern long __copy_user_nocache(void *dst, const void __user *src, | |||
| 189 | unsigned size, int zerorest); | 189 | unsigned size, int zerorest); |
| 190 | 190 | ||
| 191 | static inline int __copy_from_user_nocache(void *dst, const void __user *src, | 191 | static inline int __copy_from_user_nocache(void *dst, const void __user *src, |
| 192 | unsigned size) | 192 | unsigned size, unsigned long total) |
| 193 | { | 193 | { |
| 194 | might_sleep(); | 194 | might_sleep(); |
| 195 | /* | 195 | /* |
| @@ -205,8 +205,7 @@ static inline int __copy_from_user_nocache(void *dst, const void __user *src, | |||
| 205 | } | 205 | } |
| 206 | 206 | ||
| 207 | static inline int __copy_from_user_inatomic_nocache(void *dst, | 207 | static inline int __copy_from_user_inatomic_nocache(void *dst, |
| 208 | const void __user *src, | 208 | const void __user *src, unsigned size, unsigned total) |
| 209 | unsigned size) | ||
| 210 | { | 209 | { |
| 211 | if (likely(size >= PAGE_SIZE)) | 210 | if (likely(size >= PAGE_SIZE)) |
| 212 | return __copy_user_nocache(dst, src, size, 0); | 211 | return __copy_user_nocache(dst, src, size, 0); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 818576654092..6b209db8370d 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -215,7 +215,7 @@ fast_user_write(struct io_mapping *mapping, | |||
| 215 | 215 | ||
| 216 | vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base); | 216 | vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base); |
| 217 | unwritten = __copy_from_user_inatomic_nocache(vaddr_atomic + page_offset, | 217 | unwritten = __copy_from_user_inatomic_nocache(vaddr_atomic + page_offset, |
| 218 | user_data, length); | 218 | user_data, length, length); |
| 219 | io_mapping_unmap_atomic(vaddr_atomic); | 219 | io_mapping_unmap_atomic(vaddr_atomic); |
| 220 | if (unwritten) | 220 | if (unwritten) |
| 221 | return -EFAULT; | 221 | return -EFAULT; |
diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h index 6b58367d145e..6f3c603b0d67 100644 --- a/include/linux/uaccess.h +++ b/include/linux/uaccess.h | |||
| @@ -41,13 +41,13 @@ static inline void pagefault_enable(void) | |||
| 41 | #ifndef ARCH_HAS_NOCACHE_UACCESS | 41 | #ifndef ARCH_HAS_NOCACHE_UACCESS |
| 42 | 42 | ||
| 43 | static inline unsigned long __copy_from_user_inatomic_nocache(void *to, | 43 | static inline unsigned long __copy_from_user_inatomic_nocache(void *to, |
| 44 | const void __user *from, unsigned long n) | 44 | const void __user *from, unsigned long n, unsigned long total) |
| 45 | { | 45 | { |
| 46 | return __copy_from_user_inatomic(to, from, n); | 46 | return __copy_from_user_inatomic(to, from, n); |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | static inline unsigned long __copy_from_user_nocache(void *to, | 49 | static inline unsigned long __copy_from_user_nocache(void *to, |
| 50 | const void __user *from, unsigned long n) | 50 | const void __user *from, unsigned long n, unsigned long total) |
| 51 | { | 51 | { |
| 52 | return __copy_from_user(to, from, n); | 52 | return __copy_from_user(to, from, n); |
| 53 | } | 53 | } |
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, |
diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c index 0c04615651b7..bf54f8a2cf1d 100644 --- a/mm/filemap_xip.c +++ b/mm/filemap_xip.c | |||
| @@ -354,7 +354,7 @@ __xip_file_write(struct file *filp, const char __user *buf, | |||
| 354 | break; | 354 | break; |
| 355 | 355 | ||
| 356 | copied = bytes - | 356 | copied = bytes - |
| 357 | __copy_from_user_nocache(xip_mem + offset, buf, bytes); | 357 | __copy_from_user_nocache(xip_mem + offset, buf, bytes, bytes); |
| 358 | 358 | ||
| 359 | if (likely(copied > 0)) { | 359 | if (likely(copied > 0)) { |
| 360 | status = copied; | 360 | status = copied; |
