avr32: switch to RAW_COPY_USER
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 28 Mar 2017 20:03:51 +0000 (16:03 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 28 Mar 2017 22:23:25 +0000 (18:23 -0400)
This one needs profiling; use of asm variant of access_ok() might have
been performance-critical.  Now copy_{to,from}_user() are using the
C variant.  I doubt that it's going to have visible effects, but
that needs to be experimentally verified.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/avr32/Kconfig
arch/avr32/include/asm/uaccess.h
arch/avr32/kernel/avr32_ksyms.c
arch/avr32/lib/copy_user.S

index 7e75d45e20cdf271ce8f0025fc362e3c37048dfd..8c349f2a9ebbf7064e745216905e31f204555911 100644 (file)
@@ -19,6 +19,7 @@ config AVR32
        select HAVE_MOD_ARCH_SPECIFIC
        select MODULES_USE_ELF_RELA
        select HAVE_NMI
+       select ARCH_HAS_RAW_COPY_USER
        help
          AVR32 is a high-performance 32-bit RISC microprocessor core,
          designed for cost-sensitive embedded applications, with particular
index 5f3ce85c1ed7e92c0f480dfcfed924eb63cc9ca7..619d50e843a57487036e2e6841c533948f8645e2 100644 (file)
@@ -66,34 +66,18 @@ static inline void set_fs(mm_segment_t s)
 extern __kernel_size_t __copy_user(void *to, const void *from,
                                   __kernel_size_t n);
 
-extern __kernel_size_t copy_to_user(void __user *to, const void *from,
-                                   __kernel_size_t n);
-extern __kernel_size_t ___copy_from_user(void *to, const void __user *from,
-                                     __kernel_size_t n);
-
-static inline __kernel_size_t __copy_to_user(void __user *to, const void *from,
-                                            __kernel_size_t n)
+static inline unsigned long
+raw_copy_to_user(void __user *to, const void *from, unsigned long n)
 {
        return __copy_user((void __force *)to, from, n);
 }
-static inline __kernel_size_t __copy_from_user(void *to,
-                                              const void __user *from,
-                                              __kernel_size_t n)
+static inline unsigned long
+raw_copy_from_user(void *to, const void __user *from, unsigned long n)
 {
        return __copy_user(to, (const void __force *)from, n);
 }
-static inline __kernel_size_t copy_from_user(void *to,
-                                              const void __user *from,
-                                              __kernel_size_t n)
-{
-       size_t res = ___copy_from_user(to, from, n);
-       if (unlikely(res))
-               memset(to + (n - res), 0, res);
-       return res;
-}
-
-#define __copy_to_user_inatomic __copy_to_user
-#define __copy_from_user_inatomic __copy_from_user
+#define INLINE_COPY_FROM_USER
+#define INLINE_COPY_TO_USER
 
 /*
  * put_user: - Write a simple value into user space.
index 0d05fd095468396522986df51fdc4f17f42dcb62..0cdae8eb0220bac5e34ee93fbf43027c0add8bda 100644 (file)
@@ -36,8 +36,6 @@ EXPORT_SYMBOL(copy_page);
 /*
  * Userspace access stuff.
  */
-EXPORT_SYMBOL(___copy_from_user);
-EXPORT_SYMBOL(copy_to_user);
 EXPORT_SYMBOL(__copy_user);
 EXPORT_SYMBOL(strncpy_from_user);
 EXPORT_SYMBOL(__strncpy_from_user);
index 075373471da11d011871ab4681e7ded58732ddfb..f43275796a0cf7bb133da416ed45279e1dded7ff 100644 (file)
         */
        .text
        .align  1
-       .global ___copy_from_user
-       .type   ___copy_from_user, @function
-___copy_from_user:
-       branch_if_kernel r8, __copy_user
-       ret_if_privileged r8, r11, r10, r10
-       rjmp    __copy_user
-       .size   ___copy_from_user, . - ___copy_from_user
-
-       .global copy_to_user
-       .type   copy_to_user, @function
-copy_to_user:
-       branch_if_kernel r8, __copy_user
-       ret_if_privileged r8, r12, r10, r10
-       .size   copy_to_user, . - copy_to_user
-
        .global __copy_user
        .type   __copy_user, @function
 __copy_user: