diff options
Diffstat (limited to 'arch/mips/include/asm/spinlock.h')
| -rw-r--r-- | arch/mips/include/asm/spinlock.h | 124 | 
1 files changed, 46 insertions, 78 deletions
diff --git a/arch/mips/include/asm/spinlock.h b/arch/mips/include/asm/spinlock.h index 396e402fbe2..78d201fb6c8 100644 --- a/arch/mips/include/asm/spinlock.h +++ b/arch/mips/include/asm/spinlock.h @@ -17,7 +17,7 @@  /*   * Your basic SMP spinlocks, allowing only a single CPU anywhere   * - * Simple spin lock operations.  There are two variants, one clears IRQ's + * Simple spin lock operations.	 There are two variants, one clears IRQ's   * on the local processor, one does not.   *   * These are fair FIFO ticket locks @@ -71,7 +71,6 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)  		"	 nop						\n"  		"	srl	%[my_ticket], %[ticket], 16		\n"  		"	andi	%[ticket], %[ticket], 0xffff		\n" -		"	andi	%[my_ticket], %[my_ticket], 0xffff	\n"  		"	bne	%[ticket], %[my_ticket], 4f		\n"  		"	 subu	%[ticket], %[my_ticket], %[ticket]	\n"  		"2:							\n" @@ -105,7 +104,6 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)  		"	beqz	%[my_ticket], 1b			\n"  		"	 srl	%[my_ticket], %[ticket], 16		\n"  		"	andi	%[ticket], %[ticket], 0xffff		\n" -		"	andi	%[my_ticket], %[my_ticket], 0xffff	\n"  		"	bne	%[ticket], %[my_ticket], 4f		\n"  		"	 subu	%[ticket], %[my_ticket], %[ticket]	\n"  		"2:							\n" @@ -153,7 +151,6 @@ static inline unsigned int arch_spin_trylock(arch_spinlock_t *lock)  		"							\n"  		"1:	ll	%[ticket], %[ticket_ptr]		\n"  		"	srl	%[my_ticket], %[ticket], 16		\n" -		"	andi	%[my_ticket], %[my_ticket], 0xffff	\n"  		"	andi	%[now_serving], %[ticket], 0xffff	\n"  		"	bne	%[my_ticket], %[now_serving], 3f	\n"  		"	 addu	%[ticket], %[ticket], %[inc]		\n" @@ -178,7 +175,6 @@ static inline unsigned int arch_spin_trylock(arch_spinlock_t *lock)  		"							\n"  		"1:	ll	%[ticket], %[ticket_ptr]		\n"  		"	srl	%[my_ticket], %[ticket], 16		\n" -		"	andi	%[my_ticket], %[my_ticket], 0xffff	\n"  		"	andi	%[now_serving], %[ticket], 0xffff	\n"  		"	bne	%[my_ticket], %[now_serving], 3f	\n"  		"	 addu	%[ticket], %[ticket], %[inc]		\n" @@ -222,7 +218,7 @@ static inline unsigned int arch_spin_trylock(arch_spinlock_t *lock)   * write_can_lock - would write_trylock() succeed?   * @lock: the rwlock in question.   */ -#define arch_write_can_lock(rw)	(!(rw)->lock) +#define arch_write_can_lock(rw) (!(rw)->lock)  static inline void arch_read_lock(arch_rwlock_t *rw)  { @@ -242,25 +238,16 @@ static inline void arch_read_lock(arch_rwlock_t *rw)  		: "m" (rw->lock)  		: "memory");  	} else { -		__asm__ __volatile__( -		"	.set	noreorder	# arch_read_lock	\n" -		"1:	ll	%1, %2					\n" -		"	bltz	%1, 2f					\n" -		"	 addu	%1, 1					\n" -		"	sc	%1, %0					\n" -		"	beqz	%1, 1b					\n" -		"	 nop						\n" -		"	.subsection 2					\n" -		"2:	ll	%1, %2					\n" -		"	bltz	%1, 2b					\n" -		"	 addu	%1, 1					\n" -		"	b	1b					\n" -		"	 nop						\n" -		"	.previous					\n" -		"	.set	reorder					\n" -		: "=m" (rw->lock), "=&r" (tmp) -		: "m" (rw->lock) -		: "memory"); +		do { +			__asm__ __volatile__( +			"1:	ll	%1, %2	# arch_read_lock	\n" +			"	bltz	%1, 1b				\n" +			"	 addu	%1, 1				\n" +			"2:	sc	%1, %0				\n" +			: "=m" (rw->lock), "=&r" (tmp) +			: "m" (rw->lock) +			: "memory"); +		} while (unlikely(!tmp));  	}  	smp_llsc_mb(); @@ -285,21 +272,15 @@ static inline void arch_read_unlock(arch_rwlock_t *rw)  		: "m" (rw->lock)  		: "memory");  	} else { -		__asm__ __volatile__( -		"	.set	noreorder	# arch_read_unlock	\n" -		"1:	ll	%1, %2					\n" -		"	sub	%1, 1					\n" -		"	sc	%1, %0					\n" -		"	beqz	%1, 2f					\n" -		"	 nop						\n" -		"	.subsection 2					\n" -		"2:	b	1b					\n" -		"	 nop						\n" -		"	.previous					\n" -		"	.set	reorder					\n" -		: "=m" (rw->lock), "=&r" (tmp) -		: "m" (rw->lock) -		: "memory"); +		do { +			__asm__ __volatile__( +			"1:	ll	%1, %2	# arch_read_unlock	\n" +			"	sub	%1, 1				\n" +			"	sc	%1, %0				\n" +			: "=m" (rw->lock), "=&r" (tmp) +			: "m" (rw->lock) +			: "memory"); +		} while (unlikely(!tmp));  	}  } @@ -321,25 +302,16 @@ static inline void arch_write_lock(arch_rwlock_t *rw)  		: "m" (rw->lock)  		: "memory");  	} else { -		__asm__ __volatile__( -		"	.set	noreorder	# arch_write_lock	\n" -		"1:	ll	%1, %2					\n" -		"	bnez	%1, 2f					\n" -		"	 lui	%1, 0x8000				\n" -		"	sc	%1, %0					\n" -		"	beqz	%1, 2f					\n" -		"	 nop						\n" -		"	.subsection 2					\n" -		"2:	ll	%1, %2					\n" -		"	bnez	%1, 2b					\n" -		"	 lui	%1, 0x8000				\n" -		"	b	1b					\n" -		"	 nop						\n" -		"	.previous					\n" -		"	.set	reorder					\n" -		: "=m" (rw->lock), "=&r" (tmp) -		: "m" (rw->lock) -		: "memory"); +		do { +			__asm__ __volatile__( +			"1:	ll	%1, %2	# arch_write_lock	\n" +			"	bnez	%1, 1b				\n" +			"	 lui	%1, 0x8000			\n" +			"2:	sc	%1, %0				\n" +			: "=m" (rw->lock), "=&r" (tmp) +			: "m" (rw->lock) +			: "memory"); +		} while (unlikely(!tmp));  	}  	smp_llsc_mb(); @@ -424,25 +396,21 @@ static inline int arch_write_trylock(arch_rwlock_t *rw)  		: "m" (rw->lock)  		: "memory");  	} else { -		__asm__ __volatile__( -		"	.set	noreorder	# arch_write_trylock	\n" -		"	li	%2, 0					\n" -		"1:	ll	%1, %3					\n" -		"	bnez	%1, 2f					\n" -		"	lui	%1, 0x8000				\n" -		"	sc	%1, %0					\n" -		"	beqz	%1, 3f					\n" -		"	 li	%2, 1					\n" -		"2:							\n" -		__WEAK_LLSC_MB -		"	.subsection 2					\n" -		"3:	b	1b					\n" -		"	 li	%2, 0					\n" -		"	.previous					\n" -		"	.set	reorder					\n" -		: "=m" (rw->lock), "=&r" (tmp), "=&r" (ret) -		: "m" (rw->lock) -		: "memory"); +		do { +			__asm__ __volatile__( +			"	ll	%1, %3	# arch_write_trylock	\n" +			"	li	%2, 0				\n" +			"	bnez	%1, 2f				\n" +			"	lui	%1, 0x8000			\n" +			"	sc	%1, %0				\n" +			"	li	%2, 1				\n" +			"2:						\n" +			: "=m" (rw->lock), "=&r" (tmp), "=&r" (ret) +			: "m" (rw->lock) +			: "memory"); +		} while (unlikely(!tmp)); + +		smp_llsc_mb();  	}  	return ret;  | 
