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

Commit d52c2d5a authored by Dave Johnson's avatar Dave Johnson Committed by Ralf Baechle
Browse files

[MIPS] Fix __raw_read_trylock() to allow multiple readers



A deadlock can occur for mixed irq and non-irq rwlock readers if a 2nd
reader attempts to take lock by looping around __raw_read_trylock().

Signed-off-by: default avatarDave Johnson <djohnson+linux-mips@sw.starentnetworks.com>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent d0c91ae2
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -287,7 +287,7 @@ static inline int __raw_read_trylock(raw_rwlock_t *rw)
		"	.set	noreorder	# __raw_read_trylock	\n"
		"	.set	noreorder	# __raw_read_trylock	\n"
		"	li	%2, 0					\n"
		"	li	%2, 0					\n"
		"1:	ll	%1, %3					\n"
		"1:	ll	%1, %3					\n"
		"	bnez	%1, 2f					\n"
		"	bltz	%1, 2f					\n"
		"	 addu	%1, 1					\n"
		"	 addu	%1, 1					\n"
		"	sc	%1, %0					\n"
		"	sc	%1, %0					\n"
		"	.set	reorder					\n"
		"	.set	reorder					\n"
@@ -304,7 +304,7 @@ static inline int __raw_read_trylock(raw_rwlock_t *rw)
		"	.set	noreorder	# __raw_read_trylock	\n"
		"	.set	noreorder	# __raw_read_trylock	\n"
		"	li	%2, 0					\n"
		"	li	%2, 0					\n"
		"1:	ll	%1, %3					\n"
		"1:	ll	%1, %3					\n"
		"	bnez	%1, 2f					\n"
		"	bltz	%1, 2f					\n"
		"	 addu	%1, 1					\n"
		"	 addu	%1, 1					\n"
		"	sc	%1, %0					\n"
		"	sc	%1, %0					\n"
		"	beqz	%1, 1b					\n"
		"	beqz	%1, 1b					\n"