Unverified Commit 9537db24 authored by Paul Burton's avatar Paul Burton
Browse files

MIPS: atomic: Handle !kernel_uses_llsc first



Handle the !kernel_uses_llsc path first in our ATOMIC_OP(),
ATOMIC_OP_RETURN() & ATOMIC_FETCH_OP() macros & return from within the
block. This allows us to de-indent the kernel_uses_llsc path by one
level which will be useful when making further changes.

Signed-off-by: default avatarPaul Burton <paul.burton@mips.com>
Cc: linux-mips@vger.kernel.org
Cc: Huacai Chen <chenhc@lemote.com>
Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
Cc: linux-kernel@vger.kernel.org
parent 36d3295c
Loading
Loading
Loading
Loading
+49 −50
Original line number Diff line number Diff line
@@ -45,9 +45,17 @@
#define ATOMIC_OP(op, c_op, asm_op)					\
static __inline__ void atomic_##op(int i, atomic_t * v)			\
{									\
	if (kernel_uses_llsc) {						\
	int temp;							\
									\
	if (!kernel_uses_llsc) {					\
		unsigned long flags;					\
									\
		raw_local_irq_save(flags);				\
		v->counter c_op i;					\
		raw_local_irq_restore(flags);				\
		return;							\
	}								\
									\
	loongson_llsc_mb();						\
	__asm__ __volatile__(						\
	"	.set	push					\n"	\
@@ -59,22 +67,23 @@ static __inline__ void atomic_##op(int i, atomic_t * v) \
	"	.set	pop					\n"	\
	: "=&r" (temp), "+" GCC_OFF_SMALL_ASM() (v->counter)		\
	: "Ir" (i) : __LLSC_CLOBBER);					\
	} else {							\
		unsigned long flags;					\
									\
		raw_local_irq_save(flags);				\
		v->counter c_op i;					\
		raw_local_irq_restore(flags);				\
	}								\
}

#define ATOMIC_OP_RETURN(op, c_op, asm_op)				\
static __inline__ int atomic_##op##_return_relaxed(int i, atomic_t * v)	\
{									\
	int result;							\
	int temp, result;						\
									\
	if (kernel_uses_llsc) {						\
		int temp;						\
	if (!kernel_uses_llsc) {					\
		unsigned long flags;					\
									\
		raw_local_irq_save(flags);				\
		result = v->counter;					\
		result c_op i;						\
		v->counter = result;					\
		raw_local_irq_restore(flags);				\
		return result;						\
	}								\
									\
	loongson_llsc_mb();						\
	__asm__ __volatile__(						\
@@ -89,15 +98,6 @@ static __inline__ int atomic_##op##_return_relaxed(int i, atomic_t * v) \
	: "=&r" (result), "=&r" (temp),					\
	  "+" GCC_OFF_SMALL_ASM() (v->counter)				\
	: "Ir" (i) : __LLSC_CLOBBER);					\
	} else {							\
		unsigned long flags;					\
									\
		raw_local_irq_save(flags);				\
		result = v->counter;					\
		result c_op i;						\
		v->counter = result;					\
		raw_local_irq_restore(flags);				\
	}								\
									\
	return result;							\
}
@@ -105,10 +105,17 @@ static __inline__ int atomic_##op##_return_relaxed(int i, atomic_t * v) \
#define ATOMIC_FETCH_OP(op, c_op, asm_op)				\
static __inline__ int atomic_fetch_##op##_relaxed(int i, atomic_t * v)	\
{									\
	int result;							\
	int temp, result;						\
									\
	if (kernel_uses_llsc) {						\
		int temp;						\
	if (!kernel_uses_llsc) {					\
		unsigned long flags;					\
									\
		raw_local_irq_save(flags);				\
		result = v->counter;					\
		v->counter c_op i;					\
		raw_local_irq_restore(flags);				\
		return result;						\
	}								\
									\
	loongson_llsc_mb();						\
	__asm__ __volatile__(						\
@@ -123,14 +130,6 @@ static __inline__ int atomic_fetch_##op##_relaxed(int i, atomic_t * v) \
	: "=&r" (result), "=&r" (temp),					\
	  "+" GCC_OFF_SMALL_ASM() (v->counter)				\
	: "Ir" (i) : __LLSC_CLOBBER);					\
	} else {							\
		unsigned long flags;					\
									\
		raw_local_irq_save(flags);				\
		result = v->counter;					\
		v->counter c_op i;					\
		raw_local_irq_restore(flags);				\
	}								\
									\
	return result;							\
}