[CRIU] [PATCH 6/9] zdtm: use architecture-specific atomic operations

Alexander Kartashov alekskartashov at parallels.com
Wed Jan 16 03:28:28 EST 2013


The test static/session01 fails to compile on ARM
because it uses x86-specific atomic operations.

It seems unfeasible to implement architecture-specific
operations for the test-suite so the build system is modified
to use the same atomic operation implementation both for
crtools and its test suite.

The header test/zdtm/lib/lock.h is modified to use
other declaration of the type atomic_t.

Signed-off-by: Alexander Kartashov <alekskartashov at parallels.com>
---
 Makefile                          |    5 +++--
 test/zdtm/lib/atomic.h            |   43 +------------------------------------
 test/zdtm/lib/lock.h              |   26 +++++++++++-----------
 test/zdtm/lib/zdtmtst.h           |    2 ++
 test/zdtm/live/static/Makefile    |    3 ++-
 test/zdtm/live/static/session01.c |    1 +
 6 files changed, 22 insertions(+), 58 deletions(-)

diff --git a/Makefile b/Makefile
index 04ac3c1..18cd792 100644
--- a/Makefile
+++ b/Makefile
@@ -38,7 +38,7 @@ ifeq ($(uname_M),i386)
 endif
 ifeq ($(uname_M),x86_64)
 	ARCH         := x86
-	DEFINES      := -DCONFIG_X86_64
+	ARCH_DEFINES := -DCONFIG_X86_64
 	LDARCH       := i386:x86-64
 endif
 
@@ -51,6 +51,7 @@ CFLAGS		+= -I$(SRC_DIR)/include -I$(SRC_DIR)/pie -I$(ARCH_DIR) -iquote $(ARCH_DI
 
 LIBS		:= -lrt -lpthread -lprotobuf-c
 
+DEFINES		+= $(ARCH_DEFINES)
 DEFINES		+= -D_FILE_OFFSET_BITS=64
 DEFINES		+= -D_GNU_SOURCE
 
@@ -75,7 +76,7 @@ CFLAGS		+= $(WARNINGS) $(DEFINES)
 SYSCALL-LIB	= $(SRC_DIR)/arch/$(ARCH)/syscalls.o
 PROTOBUF-LIB	= $(SRC_DIR)/protobuf/protobuf-lib.o
 
-export E Q CC ECHO MAKE CFLAGS LIBS ARCH DEFINES MAKEFLAGS SRC_DIR SYSCALL-LIB SH ARCH_DIR OBJCOPY LDARCH
+export E Q CC ECHO MAKE CFLAGS LIBS ARCH DEFINES MAKEFLAGS SRC_DIR SYSCALL-LIB SH ARCH_DIR OBJCOPY LDARCH ARCH_DEFINES
 
 
 PROGRAM		:= crtools
diff --git a/test/zdtm/lib/atomic.h b/test/zdtm/lib/atomic.h
index 3debc48..0da77a8 100644
--- a/test/zdtm/lib/atomic.h
+++ b/test/zdtm/lib/atomic.h
@@ -1,42 +1 @@
-#ifndef ATOMIC_H__
-#define ATOMIC_H__
-
-#define atomic_set(mem, v)					\
-	({							\
-		asm volatile ("lock xchg %0, %1\n"		\
-				: "+r" (v), "+m" (*mem)		\
-				:				\
-				: "cc", "memory");		\
-	})
-
-#define atomic_get(mem)						\
-	({							\
-		uint32_t ret__ = 0;					\
-		asm volatile ("lock xadd %0, %1\n"		\
-				: "+r" (ret__),	"+m" (*mem)	\
-				:				\
-				: "cc", "memory");		\
-		ret__;						\
-	})
-
-#define atomic_inc(mem)						\
-	({							\
-		uint32_t ret__ = 1;					\
-		asm volatile ("lock xadd %0, %1\n"		\
-				: "+r" (ret__),	"+m" (*mem)	\
-				:				\
-				: "cc", "memory");		\
-		ret__;						\
-	})
-
-#define atomic_dec(mem)						\
-	({							\
-		uint32_t ret__ = -1;					\
-		asm volatile ("lock xadd %0, %1\n"		\
-				: "+r" (ret__),	"+m" (*mem)	\
-				:				\
-				: "cc", "memory");		\
-		ret__;						\
-	})
-
-#endif /* ATOMIC_H__ */
+#include "asm/atomic.h"
diff --git a/test/zdtm/lib/lock.h b/test/zdtm/lib/lock.h
index 20d7cbd..19da579 100644
--- a/test/zdtm/lib/lock.h
+++ b/test/zdtm/lib/lock.h
@@ -16,7 +16,7 @@
 		}							\
 	} while (0)
 typedef struct {
-	uint32_t	raw;
+	atomic_t	raw;
 } futex_t;
 
 #define FUTEX_ABORT_FLAG	(0x80000000)
@@ -49,11 +49,11 @@ static inline void futex_set(futex_t *f, uint32_t v)
 		uint32_t tmp;					\
 								\
 		while (1) {					\
-			tmp = (__f)->raw;			\
+			tmp = (__f)->raw.counter;		\
 			if ((tmp & FUTEX_ABORT_FLAG) ||		\
 			    (tmp __cond (__v)))			\
 				break;				\
-			ret = sys_futex(&(__f)->raw, FUTEX_WAIT,\
+			ret = sys_futex(&(__f)->raw.counter, FUTEX_WAIT,\
 					tmp, NULL, NULL, 0);	\
 			if (ret < 0 && errno == EAGAIN)			\
 				continue;			\
@@ -65,7 +65,7 @@ static inline void futex_set(futex_t *f, uint32_t v)
 static inline void futex_set_and_wake(futex_t *f, uint32_t v)
 {
 	atomic_set(&f->raw, v);
-	BUG_ON(sys_futex(&f->raw, FUTEX_WAKE, INT_MAX, NULL, NULL, 0) < 0);
+	BUG_ON(sys_futex(&f->raw.counter, FUTEX_WAKE, INT_MAX, NULL, NULL, 0) < 0);
 }
 
 /* Mark futex @f as wait abort needed and wake up all waiters */
@@ -78,14 +78,14 @@ static inline void futex_abort_and_wake(futex_t *f)
 static inline void futex_dec_and_wake(futex_t *f)
 {
 	atomic_dec(&f->raw);
-	BUG_ON(sys_futex(&f->raw, FUTEX_WAKE, INT_MAX, NULL, NULL, 0) < 0);
+	BUG_ON(sys_futex(&f->raw.counter, FUTEX_WAKE, INT_MAX, NULL, NULL, 0) < 0);
 }
 
 /* Plain increment futex @f value */
-static inline void futex_inc(futex_t *f) { f->raw++; }
+static inline void futex_inc(futex_t *f) { atomic_inc(&f->raw); }
 
 /* Plain decrement futex @f value */
-static inline void futex_dec(futex_t *f) { f->raw--; }
+static inline void futex_dec(futex_t *f) { atomic_dec(&f->raw); }
 
 /* Wait until futex @f value become @v */
 static inline void futex_wait_until(futex_t *f, uint32_t v)
@@ -98,18 +98,18 @@ static inline void futex_wait_while_gt(futex_t *f, uint32_t v)
 /* Wait while futex @f value is @v */
 static inline uint32_t futex_wait_while(futex_t *f, uint32_t v)
 {
-	while (f->raw == v) {
-		int ret = sys_futex(&f->raw, FUTEX_WAIT, v, NULL, NULL, 0);
+	while (f->raw.counter == v) {
+		int ret = sys_futex(&f->raw.counter, FUTEX_WAIT, v, NULL, NULL, 0);
 		if (ret < 0 && errno == EAGAIN)
 			continue;
 		BUG_ON(ret < 0 && errno != EWOULDBLOCK);
 	}
 
-	return f->raw;
+	return f->raw.counter;
 }
 
 typedef struct {
-	uint32_t	raw;
+	atomic_t	raw;
 } mutex_t;
 
 static void inline mutex_init(mutex_t *m)
@@ -124,7 +124,7 @@ static void inline mutex_lock(mutex_t *m)
 	int ret;
 
 	while ((c = atomic_inc(&m->raw))) {
-		ret = sys_futex(&m->raw, FUTEX_WAIT, c + 1, NULL, NULL, 0);
+		ret = sys_futex(&m->raw.counter, FUTEX_WAIT, c + 1, NULL, NULL, 0);
 		BUG_ON(ret < 0 && ret != -EWOULDBLOCK);
 	}
 }
@@ -133,7 +133,7 @@ static void inline mutex_unlock(mutex_t *m)
 {
 	uint32_t c = 0;
 	atomic_set(&m->raw, c);
-	BUG_ON(sys_futex(&m->raw, FUTEX_WAKE, 1, NULL, NULL, 0) < 0);
+	BUG_ON(sys_futex(&m->raw.counter, FUTEX_WAKE, 1, NULL, NULL, 0) < 0);
 }
 
 #endif /* CR_LOCK_H_ */
diff --git a/test/zdtm/lib/zdtmtst.h b/test/zdtm/lib/zdtmtst.h
index 323b70e..4eb3b57 100644
--- a/test/zdtm/lib/zdtmtst.h
+++ b/test/zdtm/lib/zdtmtst.h
@@ -84,8 +84,10 @@ extern int parse_opt_string(char *param, void *arg);
 #include <stdio.h>
 #include <errno.h>
 
+#ifndef __stringify
 #define __stringify_1(x)        #x
 #define __stringify(x)          __stringify_1(x)
+#endif
 
 /* message helpers */
 extern void setup_outfile(void);
diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile
index 8a67dd2..af2a332 100644
--- a/test/zdtm/live/static/Makefile
+++ b/test/zdtm/live/static/Makefile
@@ -1,7 +1,7 @@
 LIBDIR	= ../../lib
 LIB	= $(LIBDIR)/libzdtmtst.a
 override CPPFLAGS += -I$(LIBDIR)
-CFLAGS	= -g -O2 -Wall -Werror -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
+CFLAGS	= -g -O2 -Wall -Werror -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 $(ARCH_DEFINES)
 
 TST_NOFILE	=				\
 		busyloop00			\
@@ -219,6 +219,7 @@ posix_timers:		override LDLIBS += -lrt
 socket-tcp6: override CFLAGS += -D ZDTM_IPV6
 socket-tcpbuf6: override CFLAGS += -D ZDTM_IPV6
 socket_listen6: override CFLAGS += -D ZDTM_IPV6
+session01:		override CPPFLAGS += -iquote $(ARCH_DIR)/include -I$(SRC_DIR)/include
 
 $(LIB):	force
 	$(MAKE) -C $(LIBDIR)
diff --git a/test/zdtm/live/static/session01.c b/test/zdtm/live/static/session01.c
index 2fe6aab..d26f7dd 100644
--- a/test/zdtm/live/static/session01.c
+++ b/test/zdtm/live/static/session01.c
@@ -5,6 +5,7 @@
 #include <sys/wait.h>
 #include <sys/mman.h>
 
+#include "asm/types.h"
 #include "zdtmtst.h"
 #include "lock.h"
 
-- 
1.7.10.4



More information about the CRIU mailing list