x86: get rid of user_atomic_cmpxchg_inatomic()
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 20 Mar 2020 02:23:48 +0000 (22:23 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 28 Mar 2020 03:58:55 +0000 (23:58 -0400)
Only one user left; the thing had been made polymorphic back in 2013
for the sake of MPX.  No point keeping it now that MPX is gone.
Convert futex_atomic_cmpxchg_inatomic() to user_access_{begin,end}()
while we are at it.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/x86/include/asm/futex.h
arch/x86/include/asm/uaccess.h

index 5ff7626a333dcd83a1f1673c570b1fb61197937a..f9c00110a69addc3b8e20b4de0a13be52808c797 100644 (file)
@@ -90,7 +90,25 @@ Efault:
 static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
                                                u32 oldval, u32 newval)
 {
-       return user_atomic_cmpxchg_inatomic(uval, uaddr, oldval, newval);
+       int ret = 0;
+
+       if (!user_access_begin(uaddr, sizeof(u32)))
+               return -EFAULT;
+       asm volatile("\n"
+               "1:\t" LOCK_PREFIX "cmpxchgl %4, %2\n"
+               "2:\n"
+               "\t.section .fixup, \"ax\"\n"
+               "3:\tmov     %3, %0\n"
+               "\tjmp     2b\n"
+               "\t.previous\n"
+               _ASM_EXTABLE_UA(1b, 3b)
+               : "+r" (ret), "=a" (oldval), "+m" (*uaddr)
+               : "i" (-EFAULT), "r" (newval), "1" (oldval)
+               : "memory"
+       );
+       user_access_end();
+       *uval = oldval;
+       return ret;
 }
 
 #endif
index 61d93f062a36e0a567a69ee29ee7337deefa5e67..ea6fc643ccfe7c95b71252f728db69ffbcbb2464 100644 (file)
@@ -584,99 +584,6 @@ extern __must_check long strnlen_user(const char __user *str, long n);
 unsigned long __must_check clear_user(void __user *mem, unsigned long len);
 unsigned long __must_check __clear_user(void __user *mem, unsigned long len);
 
-extern void __cmpxchg_wrong_size(void)
-       __compiletime_error("Bad argument size for cmpxchg");
-
-#define __user_atomic_cmpxchg_inatomic(uval, ptr, old, new, size)      \
-({                                                                     \
-       int __ret = 0;                                                  \
-       __typeof__(*(ptr)) __old = (old);                               \
-       __typeof__(*(ptr)) __new = (new);                               \
-       __uaccess_begin_nospec();                                       \
-       switch (size) {                                                 \
-       case 1:                                                         \
-       {                                                               \
-               asm volatile("\n"                                       \
-                       "1:\t" LOCK_PREFIX "cmpxchgb %4, %2\n"          \
-                       "2:\n"                                          \
-                       "\t.section .fixup, \"ax\"\n"                   \
-                       "3:\tmov     %3, %0\n"                          \
-                       "\tjmp     2b\n"                                \
-                       "\t.previous\n"                                 \
-                       _ASM_EXTABLE_UA(1b, 3b)                         \
-                       : "+r" (__ret), "=a" (__old), "+m" (*(ptr))     \
-                       : "i" (-EFAULT), "q" (__new), "1" (__old)       \
-                       : "memory"                                      \
-               );                                                      \
-               break;                                                  \
-       }                                                               \
-       case 2:                                                         \
-       {                                                               \
-               asm volatile("\n"                                       \
-                       "1:\t" LOCK_PREFIX "cmpxchgw %4, %2\n"          \
-                       "2:\n"                                          \
-                       "\t.section .fixup, \"ax\"\n"                   \
-                       "3:\tmov     %3, %0\n"                          \
-                       "\tjmp     2b\n"                                \
-                       "\t.previous\n"                                 \
-                       _ASM_EXTABLE_UA(1b, 3b)                         \
-                       : "+r" (__ret), "=a" (__old), "+m" (*(ptr))     \
-                       : "i" (-EFAULT), "r" (__new), "1" (__old)       \
-                       : "memory"                                      \
-               );                                                      \
-               break;                                                  \
-       }                                                               \
-       case 4:                                                         \
-       {                                                               \
-               asm volatile("\n"                                       \
-                       "1:\t" LOCK_PREFIX "cmpxchgl %4, %2\n"          \
-                       "2:\n"                                          \
-                       "\t.section .fixup, \"ax\"\n"                   \
-                       "3:\tmov     %3, %0\n"                          \
-                       "\tjmp     2b\n"                                \
-                       "\t.previous\n"                                 \
-                       _ASM_EXTABLE_UA(1b, 3b)                         \
-                       : "+r" (__ret), "=a" (__old), "+m" (*(ptr))     \
-                       : "i" (-EFAULT), "r" (__new), "1" (__old)       \
-                       : "memory"                                      \
-               );                                                      \
-               break;                                                  \
-       }                                                               \
-       case 8:                                                         \
-       {                                                               \
-               if (!IS_ENABLED(CONFIG_X86_64))                         \
-                       __cmpxchg_wrong_size();                         \
-                                                                       \
-               asm volatile("\n"                                       \
-                       "1:\t" LOCK_PREFIX "cmpxchgq %4, %2\n"          \
-                       "2:\n"                                          \
-                       "\t.section .fixup, \"ax\"\n"                   \
-                       "3:\tmov     %3, %0\n"                          \
-                       "\tjmp     2b\n"                                \
-                       "\t.previous\n"                                 \
-                       _ASM_EXTABLE_UA(1b, 3b)                         \
-                       : "+r" (__ret), "=a" (__old), "+m" (*(ptr))     \
-                       : "i" (-EFAULT), "r" (__new), "1" (__old)       \
-                       : "memory"                                      \
-               );                                                      \
-               break;                                                  \
-       }                                                               \
-       default:                                                        \
-               __cmpxchg_wrong_size();                                 \
-       }                                                               \
-       __uaccess_end();                                                \
-       *(uval) = __old;                                                \
-       __ret;                                                          \
-})
-
-#define user_atomic_cmpxchg_inatomic(uval, ptr, old, new)              \
-({                                                                     \
-       access_ok((ptr), sizeof(*(ptr))) ?              \
-               __user_atomic_cmpxchg_inatomic((uval), (ptr),           \
-                               (old), (new), sizeof(*(ptr))) :         \
-               -EFAULT;                                                \
-})
-
 /*
  * movsl can be slow when source and dest are not both 8-byte aligned
  */