[CRIU] [PATCH] atomic.h: make ARM version of atomic_set() return the previous value of the atomic variable
Alexander Kartashov
alekskartashov at parallels.com
Tue Jan 29 01:47:24 EST 2013
From: Andrey Vagin <avagin at openvz.org>
Andrew Vagin proposed to make atomic_set() return the previous value
of the atomic variable on ARM. This may be useful e. g. to implement
the check whether a locked mutex is being unlocked.
Signed-off-by: Andrey Vagin <avagin at openvz.org>
CC: Cyrill Gorcunov <gorcunov at openvz.org>
CC: Alexander Kartashov <alekskartashov at parallels.com>
Acked-by: Alexander Kartashov <alekskartashov at parallels.com>
---
arch/arm/include/asm/atomic.h | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h
index ccf6a7d..ad9da90 100644
--- a/arch/arm/include/asm/atomic.h
+++ b/arch/arm/include/asm/atomic.h
@@ -10,9 +10,28 @@ typedef struct {
#define smp_mb() __asm__ __volatile__ ("dmb" : : : "memory")
-#define atomic_set(mem,v) ((mem)->counter = (v))
#define atomic_get(v) (*(volatile u32 *)&(v)->counter)
+static inline unsigned int atomic_set(atomic_t *v, int i)
+{
+ unsigned int result, tmp;
+
+ smp_mb();
+
+ __asm__ __volatile__("@ __xchg4\n"
+"1: ldrex %0, [%3]\n"
+" strex %1, %2, [%3]\n"
+" teq %1, #0\n"
+" bne 1b"
+ : "=&r" (result), "=&r" (tmp)
+ : "r" (i), "r" (&v->counter)
+ : "memory", "cc");
+
+ smp_mb();
+
+ return result;
+}
+
static inline unsigned int atomic_add_return(int i, atomic_t *v)
{
unsigned long tmp;
--
1.7.10.4
More information about the CRIU
mailing list