sparc32: unify __cmpxchg_u{32,64}
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 2 Apr 2024 02:12:30 +0000 (22:12 -0400)
committerPaul E. McKenney <paulmck@kernel.org>
Wed, 10 Apr 2024 05:06:00 +0000 (22:06 -0700)
Add a macro that expands to one of those when given u32 or u64
as an argument - atomic32.c has a lot of similar stuff already.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
arch/sparc/lib/atomic32.c

index e15affb..0d215a7 100644 (file)
@@ -159,32 +159,23 @@ unsigned long sp32___change_bit(unsigned long *addr, unsigned long mask)
 }
 EXPORT_SYMBOL(sp32___change_bit);
 
-u32 __cmpxchg_u32(volatile u32 *ptr, u32 old, u32 new)
-{
-       unsigned long flags;
-       u32 prev;
-
-       spin_lock_irqsave(ATOMIC_HASH(ptr), flags);
-       if ((prev = *ptr) == old)
-               *ptr = new;
-       spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags);
-
-       return prev;
-}
+#define CMPXCHG(T)                                             \
+       T __cmpxchg_##T(volatile T *ptr, T old, T new)          \
+       {                                                       \
+               unsigned long flags;                            \
+               T prev;                                         \
+                                                               \
+               spin_lock_irqsave(ATOMIC_HASH(ptr), flags);     \
+               if ((prev = *ptr) == old)                       \
+                       *ptr = new;                             \
+               spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags);\
+                                                               \
+               return prev;                                    \
+       }
+
+CMPXCHG(u32)
+CMPXCHG(u64)
 EXPORT_SYMBOL(__cmpxchg_u32);
-
-u64 __cmpxchg_u64(volatile u64 *ptr, u64 old, u64 new)
-{
-       unsigned long flags;
-       u64 prev;
-
-       spin_lock_irqsave(ATOMIC_HASH(ptr), flags);
-       if ((prev = *ptr) == old)
-               *ptr = new;
-       spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags);
-
-       return prev;
-}
 EXPORT_SYMBOL(__cmpxchg_u64);
 
 unsigned long __xchg_u32(volatile u32 *ptr, u32 new)