Re: [patch 2/5] atomic: cmpxchg

From: Russell King
Date: Sat Nov 05 2005 - 04:00:17 EST


On Sat, Nov 05, 2005 at 06:57:28PM +1100, Nick Piggin wrote:
> Index: linux-2.6/include/asm-arm/atomic.h
> ===================================================================
> --- linux-2.6.orig/include/asm-arm/atomic.h
> +++ linux-2.6/include/asm-arm/atomic.h
> @@ -80,6 +80,23 @@ static inline int atomic_sub_return(int
> return result;
> }
>
> +static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
> +{
> + u32 oldval, res;
> +
> + do {
> + __asm__ __volatile__("@ atomic_cmpxchg\n"
> + "ldrex %1, [%2]\n"
> + "teq %1, %3\n"
> + "strexeq %0, %4, [%2]\n"
> + : "=&r" (res), "=&r" (oldval)
> + : "r" (&ptr->counter), "r" (old), "r" (new)
> + : "cc");
> + } while (res);
> +
> + return oldval;
> +}
> +
> static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
> {
> unsigned long tmp, tmp2;
> @@ -131,6 +148,21 @@ static inline int atomic_sub_return(int
> return val;
> }
>
> +static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
> +{
> + int ret;
> + unsigned long flags;
> +
> + local_irq_save(flags);
> + ret = v->counter;
> + if (likely(ret == old))
> + v->counter = new;
> + local_irq_restore(flags);
> +
> + return ret;
> +}
> +
> +static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
> static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)

This is obviously going to break ARM...

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 Serial core
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/