mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
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>
This commit is contained in:
parent
5de7bcaadf
commit
809b997a5c
|
|
@ -480,7 +480,7 @@ extern __must_check long strnlen_user(const char __user *str, long n);
|
|||
#ifdef CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE
|
||||
extern unsigned long __must_check __copy_user_flushcache(void *to, const void __user *from, unsigned long n);
|
||||
|
||||
static inline int __copy_from_user_flushcache(void *dst, const void __user *src, unsigned size)
|
||||
static inline size_t copy_from_user_flushcache(void *dst, const void __user *src, size_t size)
|
||||
{
|
||||
kasan_check_write(dst, size);
|
||||
return __copy_user_flushcache(dst, __uaccess_mask_ptr(src), size);
|
||||
|
|
|
|||
|
|
@ -405,8 +405,7 @@ copy_mc_to_user(void __user *to, const void *from, unsigned long n)
|
|||
}
|
||||
#endif
|
||||
|
||||
extern long __copy_from_user_flushcache(void *dst, const void __user *src,
|
||||
unsigned size);
|
||||
extern size_t copy_from_user_flushcache(void *dst, const void __user *src, size_t size);
|
||||
|
||||
static __must_check __always_inline bool user_access_begin(const void __user *ptr, size_t len)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -66,15 +66,16 @@ EXPORT_SYMBOL_GPL(arch_invalidate_pmem);
|
|||
/*
|
||||
* CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE symbols
|
||||
*/
|
||||
long __copy_from_user_flushcache(void *dest, const void __user *src,
|
||||
unsigned size)
|
||||
size_t copy_from_user_flushcache(void *dest, const void __user *src,
|
||||
size_t size)
|
||||
{
|
||||
unsigned long copied, start = (unsigned long) dest;
|
||||
unsigned long not_copied, start = (unsigned long) dest;
|
||||
|
||||
copied = __copy_from_user(dest, src, size);
|
||||
src = mask_user_address(src);
|
||||
not_copied = __copy_from_user(dest, src, size);
|
||||
clean_pmem_range(start, start + size);
|
||||
|
||||
return copied;
|
||||
return not_copied;
|
||||
}
|
||||
|
||||
void memcpy_flushcache(void *dest, const void *src, size_t size)
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ raw_copy_to_user(void __user *dst, const void *src, unsigned long size)
|
|||
|
||||
#define copy_to_nontemporal copy_to_nontemporal
|
||||
extern size_t copy_to_nontemporal(void *dst, const void *src, size_t size);
|
||||
extern long __copy_user_flushcache(void *dst, const void __user *src, unsigned size);
|
||||
extern size_t copy_user_flushcache(void *dst, const void __user *src, size_t size);
|
||||
|
||||
static inline int
|
||||
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,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static inline int
|
||||
__copy_from_user_flushcache(void *dst, const void __user *src, unsigned size)
|
||||
static inline size_t
|
||||
copy_from_user_flushcache(void *dst, const void __user *src, size_t size)
|
||||
{
|
||||
kasan_check_write(dst, size);
|
||||
return __copy_user_flushcache(dst, src, size);
|
||||
return copy_user_flushcache(dst, src, size);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -43,14 +43,14 @@ void arch_wb_cache_pmem(void *addr, size_t size)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(arch_wb_cache_pmem);
|
||||
|
||||
long __copy_user_flushcache(void *dst, const void __user *src, unsigned size)
|
||||
size_t copy_user_flushcache(void *dst, const void __user *src, size_t size)
|
||||
{
|
||||
unsigned long flushed, dest = (unsigned long) dst;
|
||||
long rc;
|
||||
unsigned long rc;
|
||||
|
||||
stac();
|
||||
src = masked_user_access_begin(src);
|
||||
rc = copy_to_nontemporal(dst, (__force const void *)src, size);
|
||||
clac();
|
||||
user_access_end();
|
||||
|
||||
/*
|
||||
* copy_to_nontemporal() uses non-temporal stores for the bulk
|
||||
|
|
|
|||
|
|
@ -296,7 +296,7 @@ static __always_inline
|
|||
size_t copy_from_user_iter_flushcache(void __user *iter_from, size_t progress,
|
||||
size_t len, void *to, void *priv2)
|
||||
{
|
||||
return __copy_from_user_flushcache(to + progress, iter_from, len);
|
||||
return copy_from_user_flushcache(to + progress, iter_from, len);
|
||||
}
|
||||
|
||||
static __always_inline
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user