public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Re: atomic64_t proposal
@ 2002-08-28 15:45 Robin Holt
  2002-08-28 21:39 ` H. Peter Anvin
  0 siblings, 1 reply; 9+ messages in thread
From: Robin Holt @ 2002-08-28 15:45 UTC (permalink / raw)
  To: linux-kernel


I do like the atomic_inc, atomic_dec, etc being able to handle either 
type.  While producing code, I can do a simple check at the beginning of 
the block and define the appropriate type for a particular architecture.

For instance:

#if ARCH_WORD_SIZE == 8
atomic64_t my_atomic;
#else
atomic_t my_atomic;
#endif

Without it, I end up doing alot of other magic.  I don't see a problem 
with having the #defines versus the inlines.  Why have two chunks of code 
which do exactly the same operations with only type differences?

Robin Holt


^ permalink raw reply	[flat|nested] 9+ messages in thread
[parent not found: <200208271937.OAA78345@cyan.americas.sgi.com.suse.lists.linux.kernel>]
* atomic64_t proposal
@ 2002-08-27 19:37 Dean Nelson
  2002-08-27 20:02 ` Andreas Schwab
  0 siblings, 1 reply; 9+ messages in thread
From: Dean Nelson @ 2002-08-27 19:37 UTC (permalink / raw)
  To: linux-kernel

I'm proposing the creation of an atomic64_t variable, which is a 64-bit
version of atomic_t, and the usage of the __typeof__ keyword in macro versions
of the atomic operations to enable them to operate on either type (atomic_t and
atomic64_t).

I submitted the following patch to David Mosberger to be considered for
inclusion in the IA-64 linux kernel. He suggested that I bring the topic up
on this list so that the other 64-bit platform maintainers can commment.

Thanks,
Dean


 ==============================================================================
diff -Naur 2.4.18-ia64/linux/include/asm-ia64/atomic.h linux/linux/include/asm-ia64/atomic.h
--- 2.4.18-ia64/linux/include/asm-ia64/atomic.h	Wed Jul 17 07:12:34 2002
+++ linux/linux/include/asm-ia64/atomic.h	Wed Aug 21 18:12:13 2002
@@ -5,10 +5,6 @@
  * Atomic operations that C can't guarantee us.  Useful for
  * resource counting etc..
  *
- * NOTE: don't mess with the types below!  The "unsigned long" and
- * "int" types were carefully placed so as to ensure proper operation
- * of the macros.
- *
  * Copyright (C) 1998, 1999, 2002 Hewlett-Packard Co
  *	David Mosberger-Tang <davidm@hpl.hp.com>
  */
@@ -21,63 +17,59 @@
  * memory accesses are ordered.
  */
 typedef struct { volatile __s32 counter; } atomic_t;
+typedef struct { volatile __s64 counter; } atomic64_t;
 
 #define ATOMIC_INIT(i)		((atomic_t) { (i) })
+#define ATOMIC64_INIT(i)	((atomic64_t) { (i) })
 
 #define atomic_read(v)		((v)->counter)
 #define atomic_set(v,i)		(((v)->counter) = (i))
 
-static __inline__ int
-ia64_atomic_add (int i, atomic_t *v)
-{
-	__s32 old, new;
-	CMPXCHG_BUGCHECK_DECL
-
-	do {
-		CMPXCHG_BUGCHECK(v);
-		old = atomic_read(v);
-		new = old + i;
-	} while (ia64_cmpxchg("acq", v, old, old + i, sizeof(atomic_t)) != old);
-	return new;
-}
-
-static __inline__ int
-ia64_atomic_sub (int i, atomic_t *v)
-{
-	__s32 old, new;
-	CMPXCHG_BUGCHECK_DECL
-
-	do {
-		CMPXCHG_BUGCHECK(v);
-		old = atomic_read(v);
-		new = old - i;
-	} while (ia64_cmpxchg("acq", v, old, new, sizeof(atomic_t)) != old);
-	return new;
-}
+#define ia64_atomic_add(i,v)						\
+({									\
+	__typeof__((v)->counter) _old, _new;				\
+	CMPXCHG_BUGCHECK_DECL						\
+									\
+	do {								\
+		CMPXCHG_BUGCHECK(v);					\
+		_old = atomic_read(v);					\
+		_new = _old + (i);					\
+	} while (ia64_cmpxchg("acq", (v), _old, _new, sizeof(*(v))) != _old); \
+	(__typeof__((v)->counter)) _new;	/* return new value */	\
+})
+
+#define ia64_atomic_sub(i,v)						\
+({									\
+	__typeof__((v)->counter) _old, _new;				\
+	CMPXCHG_BUGCHECK_DECL						\
+									\
+	do {								\
+		CMPXCHG_BUGCHECK(v);					\
+		_old = atomic_read(v);					\
+		_new = _old - (i);					\
+	} while (ia64_cmpxchg("acq", (v), _old, _new, sizeof(*(v))) != _old); \
+	(__typeof__((v)->counter)) _new;	/* return new value */	\
+})
 
 /*
  * Atomically add I to V and return TRUE if the resulting value is
  * negative.
  */
-static __inline__ int
-atomic_add_negative (int i, atomic_t *v)
-{
-	return ia64_atomic_add(i, v) < 0;
-}
+#define atomic_add_negative(i,v)	(ia64_atomic_add((i), (v)) < 0)
 
 #define atomic_add_return(i,v)						\
 	((__builtin_constant_p(i) &&					\
 	  (   (i ==  1) || (i ==  4) || (i ==  8) || (i ==  16)		\
 	   || (i == -1) || (i == -4) || (i == -8) || (i == -16)))	\
 	 ? ia64_fetch_and_add(i, &(v)->counter)				\
-	 : ia64_atomic_add(i, v))
+	 : ia64_atomic_add((i), (v)))
 
 #define atomic_sub_return(i,v)						\
 	((__builtin_constant_p(i) &&					\
 	  (   (i ==  1) || (i ==  4) || (i ==  8) || (i ==  16)		\
 	   || (i == -1) || (i == -4) || (i == -8) || (i == -16)))	\
 	 ? ia64_fetch_and_add(-(i), &(v)->counter)			\
-	 : ia64_atomic_sub(i, v))
+	 : ia64_atomic_sub((i), (v)))
 
 #define atomic_dec_return(v)		atomic_sub_return(1, (v))
 #define atomic_inc_return(v)		atomic_add_return(1, (v))
 ==============================================================================


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2002-08-29 17:11 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-08-28 15:45 atomic64_t proposal Robin Holt
2002-08-28 21:39 ` H. Peter Anvin
     [not found] <200208271937.OAA78345@cyan.americas.sgi.com.suse.lists.linux.kernel>
2002-08-27 19:58 ` Andi Kleen
2002-08-27 20:29   ` David S. Miller
2002-08-27 20:54   ` Benjamin LaHaise
2002-08-29 17:15   ` Dean Nelson
  -- strict thread matches above, loose matches on Subject: below --
2002-08-27 19:37 Dean Nelson
2002-08-27 20:02 ` Andreas Schwab
2002-08-28 14:59   ` Dean Nelson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox