[ARM] Fix ARM __raw_read_trylock() implementation
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Thu, 31 Aug 2006 14:09:30 +0000 (15:09 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 31 Aug 2006 14:09:30 +0000 (15:09 +0100)
Matthew Wilcox pointed out that the generic implementation
of this is unfit for use.  Here's an ARM optimised version
instead.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
include/asm-arm/spinlock.h

index 406ca97a8ab29f99d381565ab3c9b745c1f147a3..e2f1d75171df5f79a15613c005672c62bf057903 100644 (file)
@@ -199,7 +199,21 @@ static inline void __raw_read_unlock(raw_rwlock_t *rw)
        : "cc");
 }
 
-#define __raw_read_trylock(lock) generic__raw_read_trylock(lock)
+static inline int __raw_read_trylock(raw_rwlock_t *rw)
+{
+       unsigned long tmp tmp2 = 1;
+
+       __asm__ __volatile__(
+"1:    ldrex   %0, [%2]\n"
+"      adds    %0, %0, #1\n"
+"      strexpl %1, %0, [%2]\n"
+       : "=&r" (tmp), "+r" (tmp2)
+       : "r" (&rw->lock)
+       : "cc");
+
+       smp_mb();
+       return tmp2 == 0;
+}
 
 /* read_can_lock - would read_trylock() succeed? */
 #define __raw_read_can_lock(x)         ((x)->lock < 0x80000000)