PERFORCE change 78743 for review
John Baldwin
jhb at FreeBSD.org
Mon Jun 20 19:38:07 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=78743
Change 78743 by jhb at 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
More information about the p4-projects
mailing list