arm64: move percpu cmpxchg implementation from cmpxchg.h to percpu.h
authorWill Deacon <will.deacon@arm.com>
Tue, 27 Feb 2018 10:48:31 +0000 (10:48 +0000)
committerWill Deacon <will.deacon@arm.com>
Tue, 27 Mar 2018 12:15:29 +0000 (13:15 +0100)
We want to avoid pulling linux/preempt.h into cmpxchg.h, since that can
introduce a circular dependency on linux/bitops.h. linux/preempt.h is
only needed by the per-cpu cmpxchg implementation, which is better off
alongside the per-cpu xchg implementation in percpu.h, so move it there
and add the missing #include.

Reported-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/include/asm/cmpxchg.h
arch/arm64/include/asm/percpu.h

index bc9e07b..19d4a18 100644 (file)
@@ -196,32 +196,6 @@ __CMPXCHG_GEN(_mb)
        __ret; \
 })
 
-/* this_cpu_cmpxchg */
-#define _protect_cmpxchg_local(pcp, o, n)                      \
-({                                                             \
-       typeof(*raw_cpu_ptr(&(pcp))) __ret;                     \
-       preempt_disable();                                      \
-       __ret = cmpxchg_local(raw_cpu_ptr(&(pcp)), o, n);       \
-       preempt_enable();                                       \
-       __ret;                                                  \
-})
-
-#define this_cpu_cmpxchg_1(ptr, o, n) _protect_cmpxchg_local(ptr, o, n)
-#define this_cpu_cmpxchg_2(ptr, o, n) _protect_cmpxchg_local(ptr, o, n)
-#define this_cpu_cmpxchg_4(ptr, o, n) _protect_cmpxchg_local(ptr, o, n)
-#define this_cpu_cmpxchg_8(ptr, o, n) _protect_cmpxchg_local(ptr, o, n)
-
-#define this_cpu_cmpxchg_double_8(ptr1, ptr2, o1, o2, n1, n2)          \
-({                                                                     \
-       int __ret;                                                      \
-       preempt_disable();                                              \
-       __ret = cmpxchg_double_local(   raw_cpu_ptr(&(ptr1)),           \
-                                       raw_cpu_ptr(&(ptr2)),           \
-                                       o1, o2, n1, n2);                \
-       preempt_enable();                                               \
-       __ret;                                                          \
-})
-
 #define __CMPWAIT_CASE(w, sz, name)                                    \
 static inline void __cmpwait_case_##name(volatile void *ptr,           \
                                         unsigned long val)             \
index 4339320..9234013 100644 (file)
 #ifndef __ASM_PERCPU_H
 #define __ASM_PERCPU_H
 
+#include <linux/preempt.h>
+
 #include <asm/alternative.h>
+#include <asm/cmpxchg.h>
 #include <asm/stack_pointer.h>
 
 static inline void set_my_cpu_offset(unsigned long off)
@@ -197,6 +200,32 @@ static inline unsigned long __percpu_xchg(void *ptr, unsigned long val,
        return ret;
 }
 
+/* this_cpu_cmpxchg */
+#define _protect_cmpxchg_local(pcp, o, n)                      \
+({                                                             \
+       typeof(*raw_cpu_ptr(&(pcp))) __ret;                     \
+       preempt_disable();                                      \
+       __ret = cmpxchg_local(raw_cpu_ptr(&(pcp)), o, n);       \
+       preempt_enable();                                       \
+       __ret;                                                  \
+})
+
+#define this_cpu_cmpxchg_1(ptr, o, n) _protect_cmpxchg_local(ptr, o, n)
+#define this_cpu_cmpxchg_2(ptr, o, n) _protect_cmpxchg_local(ptr, o, n)
+#define this_cpu_cmpxchg_4(ptr, o, n) _protect_cmpxchg_local(ptr, o, n)
+#define this_cpu_cmpxchg_8(ptr, o, n) _protect_cmpxchg_local(ptr, o, n)
+
+#define this_cpu_cmpxchg_double_8(ptr1, ptr2, o1, o2, n1, n2)          \
+({                                                                     \
+       int __ret;                                                      \
+       preempt_disable();                                              \
+       __ret = cmpxchg_double_local(   raw_cpu_ptr(&(ptr1)),           \
+                                       raw_cpu_ptr(&(ptr2)),           \
+                                       o1, o2, n1, n2);                \
+       preempt_enable();                                               \
+       __ret;                                                          \
+})
+
 #define _percpu_read(pcp)                                              \
 ({                                                                     \
        typeof(pcp) __retval;                                           \