[CRIU] [PATCH] arm: fix compilation on ARMv6

Andrew Vagin avagin at openvz.org
Mon Dec 22 03:16:39 PST 2014


Cc: Ruslan Kuprieiev <kupruser at gmail.com>
Signed-off-by: Andrew Vagin <avagin at openvz.org>
---
 arch/arm/include/asm/atomic.h |   61 +++++++++++++++++++++++++----------------
 1 file changed, 37 insertions(+), 24 deletions(-)

diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h
index 04faf58..cd0df37 100644
--- a/arch/arm/include/asm/atomic.h
+++ b/arch/arm/include/asm/atomic.h
@@ -14,10 +14,47 @@ typedef struct {
 
 #define smp_mb() __asm__ __volatile__ ("dmb" : : : "memory")
 
+static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
+{
+	int oldval;
+	unsigned long res;
+
+	smp_mb();
+	prefetchw(&ptr->counter);
+
+	do {
+		__asm__ __volatile__("@ atomic_cmpxchg\n"
+		"ldrex	%1, [%3]\n"
+		"mov	%0, #0\n"
+		"teq	%1, %4\n"
+		"strexeq %0, %5, [%3]\n"
+		    : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter)
+		    : "r" (&ptr->counter), "Ir" (old), "r" (new)
+		    : "cc");
+	} while (res);
+
+	smp_mb();
+
+	return oldval;
+}
+
 #elif defined(CONFIG_ARMV6)
 
+/* SMP isn't supported for ARMv6 */
+
 #define smp_mb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5"	: : "r" (0) : "memory")
 
+static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
+{
+        int ret;
+
+        ret = v->counter;
+        if (ret == old)
+                v->counter = new;
+
+        return ret;
+}
+
 #else
 
 #error ARM architecture version (CONFIG_ARMV*) not set or unsupported.
@@ -91,28 +128,4 @@ static inline int atomic_dec(atomic_t *v) { return atomic_sub_return(1, v) + 1;
 
 #define atomic_inc_return(v)	(atomic_add_return(1, v))
 
-static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
-{
-	int oldval;
-	unsigned long res;
-
-	smp_mb();
-	prefetchw(&ptr->counter);
-
-	do {
-		__asm__ __volatile__("@ atomic_cmpxchg\n"
-		"ldrex	%1, [%3]\n"
-		"mov	%0, #0\n"
-		"teq	%1, %4\n"
-		"strexeq %0, %5, [%3]\n"
-		    : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter)
-		    : "r" (&ptr->counter), "Ir" (old), "r" (new)
-		    : "cc");
-	} while (res);
-
-	smp_mb();
-
-	return oldval;
-}
-
 #endif /* __CR_ATOMIC_H__ */
-- 
1.7.10.4



More information about the CRIU mailing list