* [PATCH 7/9] atomic.h : powerpc [not found] <20061221000351.GF28643@Krystal> @ 2006-12-21 0:12 ` Mathieu Desnoyers 2006-12-21 3:15 ` Benjamin Herrenschmidt 0 siblings, 1 reply; 3+ messages in thread From: Mathieu Desnoyers @ 2006-12-21 0:12 UTC (permalink / raw) To: linux-kernel, Andrew Morton, Ingo Molnar, Greg Kroah-Hartman, Christoph Hellwig, paulus Cc: Martin J. Bligh, linuxppc-dev, Douglas Niehaus, ltt-dev, systemtap, Thomas Gleixner 64 bits cmpxchg, xchg and add_unless for powerpc. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> --- a/include/asm-powerpc/atomic.h +++ b/include/asm-powerpc/atomic.h @@ -165,7 +165,8 @@ static __inline__ int atomic_dec_return( return t; } -#define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n))) +#define atomic_cmpxchg(v, o, n) \ + ((__typeof__((v)->counter))cmpxchg(&((v)->counter), (o), (n))) #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) /** @@ -411,6 +412,44 @@ static __inline__ long atomic64_dec_if_p return t; } +#define atomic64_cmpxchg(v, o, n) \ + ((__typeof__((v)->counter))cmpxchg(&((v)->counter), (o), (n))) +#define atomic64_xchg(v, new) (xchg(&((v)->counter), new)) + +/** + * atomic64_add_unless - add unless the number is a given value + * @v: pointer of type atomic64_t + * @a: the amount to add to v... + * @u: ...unless v is equal to u. + * + * Atomically adds @a to @v, so long as it was not @u. + * Returns non-zero if @v was not @u, and zero otherwise. + */ +static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) +{ + long t; + + __asm__ __volatile__ ( + LWSYNC_ON_SMP +"1: ldarx %0,0,%1 # atomic_add_unless\n\ + cmpd 0,%0,%3 \n\ + beq- 2f \n\ + add %0,%2,%0 \n" + PPC405_ERR77(0,%2) +" stdcx. %0,0,%1 \n\ + bne- 1b \n" + ISYNC_ON_SMP +" subf %0,%2,%0 \n\ +2:" + : "=&r" (t) + : "r" (&v->counter), "r" (a), "r" (u) + : "cc", "memory"); + + return t != u; +} + +#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) + #endif /* __powerpc64__ */ #include <asm-generic/atomic.h> OpenPGP public key: http://krystal.dyndns.org:8080/key/compudj.gpg Key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68 ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 7/9] atomic.h : powerpc 2006-12-21 0:12 ` [PATCH 7/9] atomic.h : powerpc Mathieu Desnoyers @ 2006-12-21 3:15 ` Benjamin Herrenschmidt 2006-12-21 3:29 ` Mathieu Desnoyers 0 siblings, 1 reply; 3+ messages in thread From: Benjamin Herrenschmidt @ 2006-12-21 3:15 UTC (permalink / raw) To: Mathieu Desnoyers Cc: Andrew Morton, Greg Kroah-Hartman, linux-kernel, Martin J. Bligh, Christoph Hellwig, linuxppc-dev, Douglas Niehaus, Ingo Molnar, paulus, systemtap, ltt-dev, Thomas Gleixner > + > +/** > + * atomic64_add_unless - add unless the number is a given value > + * @v: pointer of type atomic64_t > + * @a: the amount to add to v... > + * @u: ...unless v is equal to u. > + * > + * Atomically adds @a to @v, so long as it was not @u. > + * Returns non-zero if @v was not @u, and zero otherwise. > + */ > +static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) > +{ > + long t; > + > + __asm__ __volatile__ ( > + LWSYNC_ON_SMP > +"1: ldarx %0,0,%1 # atomic_add_unless\n\ > + cmpd 0,%0,%3 \n\ > + beq- 2f \n\ > + add %0,%2,%0 \n" > + PPC405_ERR77(0,%2) > +" stdcx. %0,0,%1 \n\ > + bne- 1b \n" > + ISYNC_ON_SMP > +" subf %0,%2,%0 \n\ > +2:" > + : "=&r" (t) > + : "r" (&v->counter), "r" (a), "r" (u) > + : "cc", "memory"); > + > + return t != u; > +} > + You shouldn't try to define those when building 32 bits code... Also, the PPC405 errata, as it's name implies, is specific to 405 cores which are all 32 bits. Ben. ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 7/9] atomic.h : powerpc 2006-12-21 3:15 ` Benjamin Herrenschmidt @ 2006-12-21 3:29 ` Mathieu Desnoyers 0 siblings, 0 replies; 3+ messages in thread From: Mathieu Desnoyers @ 2006-12-21 3:29 UTC (permalink / raw) To: Benjamin Herrenschmidt Cc: Andrew Morton, Greg Kroah-Hartman, linux-kernel, Martin J. Bligh, Christoph Hellwig, linuxppc-dev, Douglas Niehaus, Ingo Molnar, paulus, systemtap, ltt-dev, Thomas Gleixner * Benjamin Herrenschmidt (benh@kernel.crashing.org) wrote: > > > + > > +/** > > + * atomic64_add_unless - add unless the number is a given value > > + * @v: pointer of type atomic64_t > > + * @a: the amount to add to v... > > + * @u: ...unless v is equal to u. > > + * > > + * Atomically adds @a to @v, so long as it was not @u. > > + * Returns non-zero if @v was not @u, and zero otherwise. > > + */ > > +static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) > > +{ > > + long t; > > + > > + __asm__ __volatile__ ( > > + LWSYNC_ON_SMP > > +"1: ldarx %0,0,%1 # atomic_add_unless\n\ > > + cmpd 0,%0,%3 \n\ > > + beq- 2f \n\ > > + add %0,%2,%0 \n" > > + PPC405_ERR77(0,%2) > > +" stdcx. %0,0,%1 \n\ > > + bne- 1b \n" > > + ISYNC_ON_SMP > > +" subf %0,%2,%0 \n\ > > +2:" > > + : "=&r" (t) > > + : "r" (&v->counter), "r" (a), "r" (u) > > + : "cc", "memory"); > > + > > + return t != u; > > +} > > + > > You shouldn't try to define those when building 32 bits code... Also, > the PPC405 errata, as it's name implies, is specific to 405 cores which > are all 32 bits. > > Ben. > > Hi Ben, It is within a #ifdef __powerpc64__ ... #endif /* __powerpc64__ */ so it should only build on 64 bits. You are right about the PPC405 errata, it seems unnecessary. The same is true for my asm-powerpc/local.h modification. Thanks, Mathieu -- OpenPGP public key: http://krystal.dyndns.org:8080/key/compudj.gpg Key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68 ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2006-12-21 3:29 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20061221000351.GF28643@Krystal> 2006-12-21 0:12 ` [PATCH 7/9] atomic.h : powerpc Mathieu Desnoyers 2006-12-21 3:15 ` Benjamin Herrenschmidt 2006-12-21 3:29 ` Mathieu Desnoyers
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).