Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e34703b authored by Russell King's avatar Russell King Committed by Russell King
Browse files

[ARM] Fix ARM __raw_read_trylock() implementation



Matthew Wilcox pointed out that the generic implementation
of this is unfit for use.  Here's an ARM optimised version
instead.

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 0355b3e0
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -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)