Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Jun 2005 19:38:04 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 78743 for review
Message-ID:  <200506201938.j5KJc4ml064299@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=78743

Change 78743 by jhb@jhb_slimer on 2005/06/20 19:37:30

	Implement round one of atomic changes: more macros, less identical
	functions.

Affected files ...

.. //depot/projects/smpng/sys/alpha/include/atomic.h#22 edit
.. //depot/projects/smpng/sys/amd64/include/atomic.h#16 edit
.. //depot/projects/smpng/sys/arm/include/atomic.h#12 edit
.. //depot/projects/smpng/sys/i386/include/atomic.h#33 edit
.. //depot/projects/smpng/sys/notes#43 edit

Differences ...

==== //depot/projects/smpng/sys/alpha/include/atomic.h#22 (text+ko) ====

@@ -216,28 +216,6 @@
 	return result;
 }
 
-#define atomic_set_char		atomic_set_8
-#define atomic_clear_char	atomic_clear_8
-#define atomic_add_char		atomic_add_8
-#define atomic_subtract_char	atomic_subtract_8
-
-#define atomic_set_short	atomic_set_16
-#define atomic_clear_short	atomic_clear_16
-#define atomic_add_short	atomic_add_16
-#define atomic_subtract_short	atomic_subtract_16
-
-#define atomic_set_int		atomic_set_32
-#define atomic_clear_int	atomic_clear_32
-#define atomic_add_int		atomic_add_32
-#define atomic_subtract_int	atomic_subtract_32
-#define atomic_readandclear_int	atomic_readandclear_32
-
-#define atomic_set_long		atomic_set_64
-#define atomic_clear_long	atomic_clear_64
-#define atomic_add_long		atomic_add_64
-#define atomic_subtract_long	atomic_subtract_64
-#define atomic_readandclear_long	atomic_readandclear_64
-
 #define ATOMIC_ACQ_REL(NAME, WIDTH, TYPE)				\
 static __inline void							\
 atomic_##NAME##_acq_##WIDTH(volatile u_int##WIDTH##_t *p, u_int##WIDTH##_t v)\
@@ -251,22 +229,9 @@
 {									\
 	alpha_mb();							\
 	atomic_##NAME##_##WIDTH(p, v);					\
-}									\
-									\
-static __inline void							\
-atomic_##NAME##_acq_##TYPE(volatile u_int##WIDTH##_t *p, u_int##WIDTH##_t v)\
-{									\
-	atomic_##NAME##_##WIDTH(p, v);					\
-	alpha_mb();							\
-}									\
-									\
-static __inline void							\
-atomic_##NAME##_rel_##TYPE(volatile u_int##WIDTH##_t *p, u_int##WIDTH##_t v)\
-{									\
-	alpha_mb();							\
-	atomic_##NAME##_##WIDTH(p, v);					\
 }
 
+/* Variants of simple arithmetic with memory barriers. */
 ATOMIC_ACQ_REL(set, 8, char)
 ATOMIC_ACQ_REL(clear, 8, char)
 ATOMIC_ACQ_REL(add, 8, char)
@@ -289,11 +254,11 @@
 /*
  * We assume that a = b will do atomic loads and stores.
  */
-#define ATOMIC_STORE_LOAD(TYPE, WIDTH)			\
-static __inline u_##TYPE				\
-atomic_load_acq_##WIDTH(volatile u_##TYPE *p)		\
+#define ATOMIC_STORE_LOAD(WIDTH)			\
+static __inline u_int##WIDTH##_t			\
+atomic_load_acq_##WIDTH(volatile u_int##WIDTH##_t *p)	\
 {							\
-	u_##TYPE v;					\
+	u_int##WIDTH##_t v;				\
 							\
 	v = *p;						\
 	alpha_mb();					\
@@ -301,32 +266,14 @@
 }							\
 							\
 static __inline void					\
-atomic_store_rel_##WIDTH(volatile u_##TYPE *p, u_##TYPE v)\
-{							\
-	alpha_mb();					\
-	*p = v;						\
-}							\
-static __inline u_##TYPE				\
-atomic_load_acq_##TYPE(volatile u_##TYPE *p)		\
-{							\
-	u_##TYPE v;					\
-							\
-	v = *p;						\
-	alpha_mb();					\
-	return (v);					\
-}							\
-							\
-static __inline void					\
-atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
+atomic_store_rel_##WIDTH(volatile u_int##WIDTH##_t *p, u_int##WIDTH##_t v)\
 {							\
 	alpha_mb();					\
 	*p = v;						\
 }
 
-ATOMIC_STORE_LOAD(char,		8)
-ATOMIC_STORE_LOAD(short,	16)
-ATOMIC_STORE_LOAD(int,		32)
-ATOMIC_STORE_LOAD(long,		64)
+ATOMIC_STORE_LOAD(32)
+ATOMIC_STORE_LOAD(64)
 
 #undef ATOMIC_STORE_LOAD
 
@@ -384,17 +331,6 @@
 	return ret;
 }
 
-#define	atomic_cmpset_int	atomic_cmpset_32
-#define	atomic_cmpset_long	atomic_cmpset_64
-
-static __inline int
-atomic_cmpset_ptr(volatile void *dst, void *exp, void *src)
-{
-
-        return (atomic_cmpset_long((volatile u_long *)dst, (u_long)exp,
-            (u_long)src));
-}
-
 static __inline u_int32_t
 atomic_cmpset_acq_32(volatile u_int32_t *p, u_int32_t cmpval, u_int32_t newval)
 {
@@ -429,10 +365,82 @@
 	return (atomic_cmpset_64(p, cmpval, newval));
 }
 
+/* Operations on chars. */
+#define atomic_set_char		atomic_set_8
+#define atomic_set_acq_char	atomic_set_acq_8
+#define atomic_set_rel_char	atomic_set_rel_8
+#define atomic_clear_char	atomic_clear_8
+#define atomic_clear_acq_char	atomic_clear_acq_8
+#define atomic_clear_rel_char	atomic_clear_rel_8
+#define atomic_add_char		atomic_add_8
+#define atomic_add_acq_char	atomic_add_acq_8
+#define atomic_add_rel_char	atomic_add_rel_8
+#define atomic_subtract_char	atomic_subtract_8
+#define atomic_subtract_acq_char	atomic_subtract_acq_8
+#define atomic_subtract_rel_char	atomic_subtract_rel_8
+
+/* Operations on shorts. */
+#define atomic_set_short	atomic_set_16
+#define atomic_set_acq_short	atomic_set_acq_16
+#define atomic_set_rel_short	atomic_set_rel_16
+#define atomic_clear_short	atomic_clear_16
+#define atomic_clear_acq_short	atomic_clear_acq_16
+#define atomic_clear_rel_short	atomic_clear_rel_16
+#define atomic_add_short	atomic_add_16
+#define atomic_add_acq_short	atomic_add_acq_16
+#define atomic_add_rel_short	atomic_add_rel_16
+#define atomic_subtract_short	atomic_subtract_16
+#define atomic_subtract_acq_short	atomic_subtract_acq_16
+#define atomic_subtract_rel_short	atomic_subtract_rel_16
+
+/* Operations on ints. */
+#define atomic_set_int		atomic_set_32
+#define atomic_set_acq_int	atomic_set_acq_32
+#define atomic_set_rel_int	atomic_set_rel_32
+#define atomic_clear_int	atomic_clear_32
+#define atomic_clear_acq_int	atomic_clear_acq_32
+#define atomic_clear_rel_int	atomic_clear_rel_32
+#define atomic_add_int		atomic_add_32
+#define atomic_add_acq_int	atomic_add_acq_32
+#define atomic_add_rel_int	atomic_add_rel_32
+#define atomic_subtract_int	atomic_subtract_32
+#define atomic_subtract_acq_int	atomic_subtract_acq_32
+#define atomic_subtract_rel_int	atomic_subtract_rel_32
+#define	atomic_cmpset_int	atomic_cmpset_32
 #define	atomic_cmpset_acq_int	atomic_cmpset_acq_32
 #define	atomic_cmpset_rel_int	atomic_cmpset_rel_32
+#define	atomic_load_acq_int	atomic_load_acq_32
+#define	atomic_store_rel_int	atomic_store_rel_32
+#define atomic_readandclear_int	atomic_readandclear_32
+
+/* Operations on longs. */
+#define atomic_set_long		atomic_set_64
+#define atomic_set_acq_long	atomic_set_acq_64
+#define atomic_set_rel_long	atomic_set_rel_64
+#define atomic_clear_long	atomic_clear_64
+#define atomic_clear_acq_long	atomic_clear_acq_64
+#define atomic_clear_rel_long	atomic_clear_rel_64
+#define atomic_add_long		atomic_add_64
+#define atomic_add_acq_long	atomic_add_acq_64
+#define atomic_add_rel_long	atomic_add_rel_64
+#define atomic_subtract_long	atomic_subtract_64
+#define atomic_subtract_acq_long	atomic_subtract_acq_64
+#define atomic_subtract_rel_long	atomic_subtract_rel_64
+#define	atomic_cmpset_long	atomic_cmpset_64
 #define	atomic_cmpset_acq_long	atomic_cmpset_acq_64
 #define	atomic_cmpset_rel_long	atomic_cmpset_rel_64
+#define	atomic_load_acq_long	atomic_load_acq_64
+#define	atomic_store_rel_long	atomic_store_rel_64
+#define atomic_readandclear_long	atomic_readandclear_64
+
+/* Operations on pointers. */
+static __inline int
+atomic_cmpset_ptr(volatile void *dst, void *exp, void *src)
+{
+
+        return (atomic_cmpset_long((volatile u_long *)dst, (u_long)exp,
+            (u_long)src));
+}
 
 static __inline int
 atomic_cmpset_acq_ptr(volatile void *dst, void *exp, void *src)

==== //depot/projects/smpng/sys/amd64/include/atomic.h#16 (text+ko) ====

@@ -162,9 +162,6 @@
 
 	return (res);
 }
-#endif /* __GNUCLIKE_ASM && __CC_SUPPORTS___INLINE */
-
-#if defined(__GNUCLIKE_ASM) && defined(__CC_SUPPORTS___INLINE)
 
 #define ATOMIC_STORE_LOAD(TYPE, LOP, SOP)		\
 static __inline u_##TYPE				\
@@ -234,6 +231,7 @@
 #undef ATOMIC_ASM
 #undef ATOMIC_STORE_LOAD
 
+/* Acquire and release variants are identical to the normal ones. */
 #define	atomic_set_acq_char		atomic_set_char
 #define	atomic_set_rel_char		atomic_set_char
 #define	atomic_clear_acq_char		atomic_clear_char
@@ -275,6 +273,7 @@
 #define atomic_cmpset_acq_ptr		atomic_cmpset_ptr
 #define atomic_cmpset_rel_ptr		atomic_cmpset_ptr
 
+/* Operations on 8-bit bytes. */
 #define	atomic_set_8		atomic_set_char
 #define	atomic_set_acq_8	atomic_set_acq_char
 #define	atomic_set_rel_8	atomic_set_rel_char
@@ -290,6 +289,7 @@
 #define	atomic_load_acq_8	atomic_load_acq_char
 #define	atomic_store_rel_8	atomic_store_rel_char
 
+/* Operations on 16-bit words. */
 #define	atomic_set_16		atomic_set_short
 #define	atomic_set_acq_16	atomic_set_acq_short
 #define	atomic_set_rel_16	atomic_set_rel_short
@@ -305,6 +305,7 @@
 #define	atomic_load_acq_16	atomic_load_acq_short
 #define	atomic_store_rel_16	atomic_store_rel_short
 
+/* Operations on 32-bit double words. */
 #define	atomic_set_32		atomic_set_int
 #define	atomic_set_acq_32	atomic_set_acq_int
 #define	atomic_set_rel_32	atomic_set_rel_int

==== //depot/projects/smpng/sys/arm/include/atomic.h#12 (text+ko) ====

@@ -283,7 +283,7 @@
 #define atomic_store_rel_ptr		atomic_store_ptr
 #define atomic_store_rel_int		atomic_store_32
 #define atomic_cmpset_rel_32		atomic_cmpset_32
-#define atomic_smpset_rel_ptr		atomic_cmpset_ptr
+#define atomic_cmpset_rel_ptr		atomic_cmpset_ptr
 #define atomic_load_acq_int		atomic_load_32
 #define atomic_clear_ptr(ptr, bit)	atomic_clear_32( \
     (volatile uint32_t *)ptr, (uint32_t)bit)

==== //depot/projects/smpng/sys/i386/include/atomic.h#33 (text+ko) ====

@@ -172,10 +172,6 @@
 
 #endif /* defined(CPU_DISABLE_CMPXCHG) */
 
-#endif /* __GNUCLIKE_ASM */
-
-#ifdef __GNUCLIKE_ASM
-
 #if defined(_KERNEL) && !defined(SMP)
 
 /*
@@ -257,19 +253,14 @@
 ATOMIC_ASM(add,	     int,   "addl %1,%0",  "ir",  v);
 ATOMIC_ASM(subtract, int,   "subl %1,%0",  "ir",  v);
 
-ATOMIC_ASM(set,	     long,  "orl %1,%0",   "ir",  v);
-ATOMIC_ASM(clear,    long,  "andl %1,%0",  "ir", ~v);
-ATOMIC_ASM(add,	     long,  "addl %1,%0",  "ir",  v);
-ATOMIC_ASM(subtract, long,  "subl %1,%0",  "ir",  v);
-
 ATOMIC_STORE_LOAD(char,	"cmpxchgb %b0,%1", "xchgb %b1,%0");
 ATOMIC_STORE_LOAD(short,"cmpxchgw %w0,%1", "xchgw %w1,%0");
 ATOMIC_STORE_LOAD(int,	"cmpxchgl %0,%1",  "xchgl %1,%0");
-ATOMIC_STORE_LOAD(long,	"cmpxchgl %0,%1",  "xchgl %1,%0");
 
 #undef ATOMIC_ASM
 #undef ATOMIC_STORE_LOAD
 
+/* Acquire and release variants are identical to the normal ones. */
 #define	atomic_set_acq_char		atomic_set_char
 #define	atomic_set_rel_char		atomic_set_char
 #define	atomic_clear_acq_char		atomic_clear_char
@@ -314,6 +305,7 @@
 #define atomic_cmpset_acq_ptr		atomic_cmpset_ptr
 #define atomic_cmpset_rel_ptr		atomic_cmpset_ptr
 
+/* Operations on 8-bit bytes. */
 #define	atomic_set_8		atomic_set_char
 #define	atomic_set_acq_8	atomic_set_acq_char
 #define	atomic_set_rel_8	atomic_set_rel_char
@@ -329,6 +321,7 @@
 #define	atomic_load_acq_8	atomic_load_acq_char
 #define	atomic_store_rel_8	atomic_store_rel_char
 
+/* Operations on 16-bit words. */
 #define	atomic_set_16		atomic_set_short
 #define	atomic_set_acq_16	atomic_set_acq_short
 #define	atomic_set_rel_16	atomic_set_rel_short
@@ -344,6 +337,7 @@
 #define	atomic_load_acq_16	atomic_load_acq_short
 #define	atomic_store_rel_16	atomic_store_rel_short
 
+/* Operations on 32-bit double words. */
 #define	atomic_set_32		atomic_set_int
 #define	atomic_set_acq_32	atomic_set_acq_int
 #define	atomic_set_rel_32	atomic_set_rel_int
@@ -363,6 +357,16 @@
 #define	atomic_cmpset_rel_32	atomic_cmpset_rel_int
 #define	atomic_readandclear_32	atomic_readandclear_int
 
+/* Operations on longs. */
+#define	atomic_set_long(p, v)		atomic_set_int((u_int *)(p), (v))
+#define	atomic_clear_long(p, v)		atomic_clear_int((u_int *)(p), (v))
+#define	atomic_add_long(p, v)		atomic_add_int((u_int *)(p), (v))
+#define	atomic_subtract_long(p, v)	atomic_subtract_int((u_int *)(p), (v))
+#define	atomic_cmpset_long(d, e, s)	atomic_cmpset_int((u_int *)(d), (e), (s))
+#define	atomic_load_acq_long(p)		atomic_load_acq_int((u_int *)(p))
+#define	atomic_store_rel_long(p, v)	atomic_store_rel_int((u_int *)(p), (v))
+#define	atomic_readandclear_long(p)	atomic_readandclear_int((u_int *)(p))
+
 #if !defined(WANT_FUNCTIONS)
 static __inline int
 atomic_cmpset_ptr(volatile void *dst, void *exp, void *src)

==== //depot/projects/smpng/sys/notes#43 (text+ko) ====

@@ -42,7 +42,7 @@
     - sys
   + start over saving current state in the ktrace branch so I can break this up
   - use more macros and duplicate less identical functions
-    - implement
+    + implement
     - test
     - commit
   - stop using '+' with "m" arguments



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200506201938.j5KJc4ml064299>