Skip to content

Commit 809b997

Browse files
committed
x86-64/arm64/powerpc: clean up and rename __copy_from_user_flushcache
This finishes the work on these odd functions that were only implemented by a handful of architectures. The 'flushcache' function was only used from the iterator code, and let's make it do the same thing that the nontemporal version does: remove the two underscores and add the user address checking. Yes, yes, the user address checking is also done at iovec import time, but we have long since walked away from the old double-underscore thing where we try to avoid address checking overhead at access time, and these functions shouldn't be so special and old-fashioned. The arm64 version already did the address check, in fact, so there it's just a matter of renaming it. For powerpc and x86-64 we now do the proper user access boilerplate. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 5de7bca commit 809b997

6 files changed

Lines changed: 17 additions & 17 deletions

File tree

arch/arm64/include/asm/uaccess.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ extern __must_check long strnlen_user(const char __user *str, long n);
480480
#ifdef CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE
481481
extern unsigned long __must_check __copy_user_flushcache(void *to, const void __user *from, unsigned long n);
482482

483-
static inline int __copy_from_user_flushcache(void *dst, const void __user *src, unsigned size)
483+
static inline size_t copy_from_user_flushcache(void *dst, const void __user *src, size_t size)
484484
{
485485
kasan_check_write(dst, size);
486486
return __copy_user_flushcache(dst, __uaccess_mask_ptr(src), size);

arch/powerpc/include/asm/uaccess.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -405,8 +405,7 @@ copy_mc_to_user(void __user *to, const void *from, unsigned long n)
405405
}
406406
#endif
407407

408-
extern long __copy_from_user_flushcache(void *dst, const void __user *src,
409-
unsigned size);
408+
extern size_t copy_from_user_flushcache(void *dst, const void __user *src, size_t size);
410409

411410
static __must_check __always_inline bool user_access_begin(const void __user *ptr, size_t len)
412411
{

arch/powerpc/lib/pmem.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,16 @@ EXPORT_SYMBOL_GPL(arch_invalidate_pmem);
6666
/*
6767
* CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE symbols
6868
*/
69-
long __copy_from_user_flushcache(void *dest, const void __user *src,
70-
unsigned size)
69+
size_t copy_from_user_flushcache(void *dest, const void __user *src,
70+
size_t size)
7171
{
72-
unsigned long copied, start = (unsigned long) dest;
72+
unsigned long not_copied, start = (unsigned long) dest;
7373

74-
copied = __copy_from_user(dest, src, size);
74+
src = mask_user_address(src);
75+
not_copied = __copy_from_user(dest, src, size);
7576
clean_pmem_range(start, start + size);
7677

77-
return copied;
78+
return not_copied;
7879
}
7980

8081
void memcpy_flushcache(void *dest, const void *src, size_t size)

arch/x86/include/asm/uaccess_64.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ raw_copy_to_user(void __user *dst, const void *src, unsigned long size)
149149

150150
#define copy_to_nontemporal copy_to_nontemporal
151151
extern size_t copy_to_nontemporal(void *dst, const void *src, size_t size);
152-
extern long __copy_user_flushcache(void *dst, const void __user *src, unsigned size);
152+
extern size_t copy_user_flushcache(void *dst, const void __user *src, size_t size);
153153

154154
static inline int
155155
copy_from_user_inatomic_nontemporal(void *dst, const void __user *src,
@@ -164,11 +164,11 @@ copy_from_user_inatomic_nontemporal(void *dst, const void __user *src,
164164
return ret;
165165
}
166166

167-
static inline int
168-
__copy_from_user_flushcache(void *dst, const void __user *src, unsigned size)
167+
static inline size_t
168+
copy_from_user_flushcache(void *dst, const void __user *src, size_t size)
169169
{
170170
kasan_check_write(dst, size);
171-
return __copy_user_flushcache(dst, src, size);
171+
return copy_user_flushcache(dst, src, size);
172172
}
173173

174174
/*

arch/x86/lib/usercopy_64.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ void arch_wb_cache_pmem(void *addr, size_t size)
4343
}
4444
EXPORT_SYMBOL_GPL(arch_wb_cache_pmem);
4545

46-
long __copy_user_flushcache(void *dst, const void __user *src, unsigned size)
46+
size_t copy_user_flushcache(void *dst, const void __user *src, size_t size)
4747
{
4848
unsigned long flushed, dest = (unsigned long) dst;
49-
long rc;
49+
unsigned long rc;
5050

51-
stac();
51+
src = masked_user_access_begin(src);
5252
rc = copy_to_nontemporal(dst, (__force const void *)src, size);
53-
clac();
53+
user_access_end();
5454

5555
/*
5656
* copy_to_nontemporal() uses non-temporal stores for the bulk

lib/iov_iter.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ static __always_inline
296296
size_t copy_from_user_iter_flushcache(void __user *iter_from, size_t progress,
297297
size_t len, void *to, void *priv2)
298298
{
299-
return __copy_from_user_flushcache(to + progress, iter_from, len);
299+
return copy_from_user_flushcache(to + progress, iter_from, len);
300300
}
301301

302302
static __always_inline

0 commit comments

Comments
 (0)