]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86-64/arm64/powerpc: clean up and rename __copy_from_user_flushcache
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 30 Mar 2026 21:52:45 +0000 (14:52 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Apr 2026 11:22:31 +0000 (13:22 +0200)
commit 809b997a5ce945ab470f70c187048fe4f5df20bf upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm64/include/asm/uaccess.h
arch/powerpc/include/asm/uaccess.h
arch/powerpc/lib/pmem.c
arch/x86/include/asm/uaccess_64.h
arch/x86/lib/usercopy_64.c
lib/iov_iter.c

index 1aa4ecb73429fed92d3863e18e559099cdd913bf..93d184b4da2fe3a6feece71b6bc0f6f95ff03219 100644 (file)
@@ -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);
index 929f7050c73a69721d0a3027f4f244ffb5475858..5ef59b1f6d6d5b981342b2d2f19c89f5f8d1f991 100644 (file)
@@ -407,8 +407,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)
 {
index 4e724c4c01add7a95d940a0240a43c7766ad4bcf..0f0f2d851ac670680de24d784d52a1dd0e00431d 100644 (file)
@@ -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)
index 52189450b82ea77b1e55b2e48c645f086019a6c8..d7daec6dd1684615cc4ea3cca1dedf0cd7c07f63 100644 (file)
@@ -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);
 }
 
 /*
index 348c9275edce1421e39277059abfac877fb78bc3..c47d8cd0e243b100831ecdb94f35621fd5488da1 100644 (file)
@@ -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
index 7e81fea459e4671a98f8f916a634e471c97f9a5a..4bc7c19337558f27faa2571573b4c5547fe84e78 100644 (file)
@@ -284,7 +284,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