diff options
Diffstat (limited to 'arch/mips/include/asm/atomic.h')
| -rw-r--r-- | arch/mips/include/asm/atomic.h | 19 | 
1 files changed, 10 insertions, 9 deletions
diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h index 9a82dd11c0e9..bb8658cc7f12 100644 --- a/arch/mips/include/asm/atomic.h +++ b/arch/mips/include/asm/atomic.h @@ -68,7 +68,7 @@ static __inline__ void atomic_##op(int i, atomic_t * v)			      \  		"\t" __scbeqz "	%0, 1b					\n"   \  		"	.set	pop					\n"   \  		: "=&r" (temp), "+" GCC_OFF_SMALL_ASM() (v->counter)	      \ -		: "Ir" (i));						      \ +		: "Ir" (i) : __LLSC_CLOBBER);				      \  	} else {							      \  		unsigned long flags;					      \  									      \ @@ -98,7 +98,7 @@ static __inline__ int atomic_##op##_return_relaxed(int i, atomic_t * v)	      \  		"	.set	pop					\n"   \  		: "=&r" (result), "=&r" (temp),				      \  		  "+" GCC_OFF_SMALL_ASM() (v->counter)			      \ -		: "Ir" (i));						      \ +		: "Ir" (i) : __LLSC_CLOBBER);				      \  	} else {							      \  		unsigned long flags;					      \  									      \ @@ -132,7 +132,7 @@ static __inline__ int atomic_fetch_##op##_relaxed(int i, atomic_t * v)	      \  		"	move	%0, %1					\n"   \  		: "=&r" (result), "=&r" (temp),				      \  		  "+" GCC_OFF_SMALL_ASM() (v->counter)			      \ -		: "Ir" (i));						      \ +		: "Ir" (i) : __LLSC_CLOBBER);				      \  	} else {							      \  		unsigned long flags;					      \  									      \ @@ -193,6 +193,7 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v)  	if (kernel_uses_llsc) {  		int temp; +		loongson_llsc_mb();  		__asm__ __volatile__(  		"	.set	push					\n"  		"	.set	"MIPS_ISA_LEVEL"			\n" @@ -200,16 +201,16 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v)  		"	.set	pop					\n"  		"	subu	%0, %1, %3				\n"  		"	move	%1, %0					\n" -		"	bltz	%0, 1f					\n" +		"	bltz	%0, 2f					\n"  		"	.set	push					\n"  		"	.set	"MIPS_ISA_LEVEL"			\n"  		"	sc	%1, %2					\n"  		"\t" __scbeqz "	%1, 1b					\n" -		"1:							\n" +		"2:							\n"  		"	.set	pop					\n"  		: "=&r" (result), "=&r" (temp),  		  "+" GCC_OFF_SMALL_ASM() (v->counter) -		: "Ir" (i)); +		: "Ir" (i) : __LLSC_CLOBBER);  	} else {  		unsigned long flags; @@ -269,7 +270,7 @@ static __inline__ void atomic64_##op(s64 i, atomic64_t * v)		      \  		"\t" __scbeqz "	%0, 1b					\n"   \  		"	.set	pop					\n"   \  		: "=&r" (temp), "+" GCC_OFF_SMALL_ASM() (v->counter)	      \ -		: "Ir" (i));						      \ +		: "Ir" (i) : __LLSC_CLOBBER);				      \  	} else {							      \  		unsigned long flags;					      \  									      \ @@ -299,7 +300,7 @@ static __inline__ s64 atomic64_##op##_return_relaxed(s64 i, atomic64_t * v)   \  		"	.set	pop					\n"   \  		: "=&r" (result), "=&r" (temp),				      \  		  "+" GCC_OFF_SMALL_ASM() (v->counter)			      \ -		: "Ir" (i));						      \ +		: "Ir" (i) : __LLSC_CLOBBER);				      \  	} else {							      \  		unsigned long flags;					      \  									      \ @@ -333,7 +334,7 @@ static __inline__ s64 atomic64_fetch_##op##_relaxed(s64 i, atomic64_t * v)    \  		"	.set	pop					\n"   \  		: "=&r" (result), "=&r" (temp),				      \  		  "+" GCC_OFF_SMALL_ASM() (v->counter)			      \ -		: "Ir" (i));						      \ +		: "Ir" (i) : __LLSC_CLOBBER);				      \  	} else {							      \  		unsigned long flags;					      \  									      \  |