Переглянути джерело

sparc64: Make lock backoff really a NOP on UP builds.

As noticed by Mikulas Patocka, the backoff macros don't
completely nop out for UP builds, we still get a
branch always and a delay slot nop.

Fix this by making the branch to the backoff spin loop
selective, then we can nop out the spin loop completely.

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 15 роки тому
батько
коміт
0f58189d4a

+ 8 - 3
arch/sparc/include/asm/backoff.h

@@ -8,6 +8,9 @@
 #define BACKOFF_SETUP(reg)	\
 #define BACKOFF_SETUP(reg)	\
 	mov	1, reg
 	mov	1, reg
 
 
+#define BACKOFF_LABEL(spin_label, continue_label) \
+	spin_label
+
 #define BACKOFF_SPIN(reg, tmp, label)	\
 #define BACKOFF_SPIN(reg, tmp, label)	\
 	mov	reg, tmp; \
 	mov	reg, tmp; \
 88:	brnz,pt	tmp, 88b; \
 88:	brnz,pt	tmp, 88b; \
@@ -22,9 +25,11 @@
 #else
 #else
 
 
 #define BACKOFF_SETUP(reg)
 #define BACKOFF_SETUP(reg)
-#define BACKOFF_SPIN(reg, tmp, label) \
-	ba,pt	%xcc, label; \
-	 nop;
+
+#define BACKOFF_LABEL(spin_label, continue_label) \
+	continue_label
+
+#define BACKOFF_SPIN(reg, tmp, label)
 
 
 #endif
 #endif
 
 

+ 8 - 8
arch/sparc/lib/atomic_64.S

@@ -21,7 +21,7 @@ atomic_add: /* %o0 = increment, %o1 = atomic_ptr */
 	add	%g1, %o0, %g7
 	add	%g1, %o0, %g7
 	cas	[%o1], %g1, %g7
 	cas	[%o1], %g1, %g7
 	cmp	%g1, %g7
 	cmp	%g1, %g7
-	bne,pn	%icc, 2f
+	bne,pn	%icc, BACKOFF_LABEL(2f, 1b)
 	 nop
 	 nop
 	retl
 	retl
 	 nop
 	 nop
@@ -36,7 +36,7 @@ atomic_sub: /* %o0 = decrement, %o1 = atomic_ptr */
 	sub	%g1, %o0, %g7
 	sub	%g1, %o0, %g7
 	cas	[%o1], %g1, %g7
 	cas	[%o1], %g1, %g7
 	cmp	%g1, %g7
 	cmp	%g1, %g7
-	bne,pn	%icc, 2f
+	bne,pn	%icc, BACKOFF_LABEL(2f, 1b)
 	 nop
 	 nop
 	retl
 	retl
 	 nop
 	 nop
@@ -51,7 +51,7 @@ atomic_add_ret: /* %o0 = increment, %o1 = atomic_ptr */
 	add	%g1, %o0, %g7
 	add	%g1, %o0, %g7
 	cas	[%o1], %g1, %g7
 	cas	[%o1], %g1, %g7
 	cmp	%g1, %g7
 	cmp	%g1, %g7
-	bne,pn	%icc, 2f
+	bne,pn	%icc, BACKOFF_LABEL(2f, 1b)
 	 add	%g1, %o0, %g1
 	 add	%g1, %o0, %g1
 	retl
 	retl
 	 sra	%g1, 0, %o0
 	 sra	%g1, 0, %o0
@@ -66,7 +66,7 @@ atomic_sub_ret: /* %o0 = decrement, %o1 = atomic_ptr */
 	sub	%g1, %o0, %g7
 	sub	%g1, %o0, %g7
 	cas	[%o1], %g1, %g7
 	cas	[%o1], %g1, %g7
 	cmp	%g1, %g7
 	cmp	%g1, %g7
-	bne,pn	%icc, 2f
+	bne,pn	%icc, BACKOFF_LABEL(2f, 1b)
 	 sub	%g1, %o0, %g1
 	 sub	%g1, %o0, %g1
 	retl
 	retl
 	 sra	%g1, 0, %o0
 	 sra	%g1, 0, %o0
@@ -81,7 +81,7 @@ atomic64_add: /* %o0 = increment, %o1 = atomic_ptr */
 	add	%g1, %o0, %g7
 	add	%g1, %o0, %g7
 	casx	[%o1], %g1, %g7
 	casx	[%o1], %g1, %g7
 	cmp	%g1, %g7
 	cmp	%g1, %g7
-	bne,pn	%xcc, 2f
+	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
 	 nop
 	 nop
 	retl
 	retl
 	 nop
 	 nop
@@ -96,7 +96,7 @@ atomic64_sub: /* %o0 = decrement, %o1 = atomic_ptr */
 	sub	%g1, %o0, %g7
 	sub	%g1, %o0, %g7
 	casx	[%o1], %g1, %g7
 	casx	[%o1], %g1, %g7
 	cmp	%g1, %g7
 	cmp	%g1, %g7
-	bne,pn	%xcc, 2f
+	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
 	 nop
 	 nop
 	retl
 	retl
 	 nop
 	 nop
@@ -111,7 +111,7 @@ atomic64_add_ret: /* %o0 = increment, %o1 = atomic_ptr */
 	add	%g1, %o0, %g7
 	add	%g1, %o0, %g7
 	casx	[%o1], %g1, %g7
 	casx	[%o1], %g1, %g7
 	cmp	%g1, %g7
 	cmp	%g1, %g7
-	bne,pn	%xcc, 2f
+	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
 	 nop
 	 nop
 	retl
 	retl
 	 add	%g1, %o0, %o0
 	 add	%g1, %o0, %o0
@@ -126,7 +126,7 @@ atomic64_sub_ret: /* %o0 = decrement, %o1 = atomic_ptr */
 	sub	%g1, %o0, %g7
 	sub	%g1, %o0, %g7
 	casx	[%o1], %g1, %g7
 	casx	[%o1], %g1, %g7
 	cmp	%g1, %g7
 	cmp	%g1, %g7
-	bne,pn	%xcc, 2f
+	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
 	 nop
 	 nop
 	retl
 	retl
 	 sub	%g1, %o0, %o0
 	 sub	%g1, %o0, %o0

+ 6 - 6
arch/sparc/lib/bitops.S

@@ -22,7 +22,7 @@ test_and_set_bit:	/* %o0=nr, %o1=addr */
 	or	%g7, %o2, %g1
 	or	%g7, %o2, %g1
 	casx	[%o1], %g7, %g1
 	casx	[%o1], %g7, %g1
 	cmp	%g7, %g1
 	cmp	%g7, %g1
-	bne,pn	%xcc, 2f
+	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
 	 and	%g7, %o2, %g2
 	 and	%g7, %o2, %g2
 	clr	%o0
 	clr	%o0
 	movrne	%g2, 1, %o0
 	movrne	%g2, 1, %o0
@@ -45,7 +45,7 @@ test_and_clear_bit:	/* %o0=nr, %o1=addr */
 	andn	%g7, %o2, %g1
 	andn	%g7, %o2, %g1
 	casx	[%o1], %g7, %g1
 	casx	[%o1], %g7, %g1
 	cmp	%g7, %g1
 	cmp	%g7, %g1
-	bne,pn	%xcc, 2f
+	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
 	 and	%g7, %o2, %g2
 	 and	%g7, %o2, %g2
 	clr	%o0
 	clr	%o0
 	movrne	%g2, 1, %o0
 	movrne	%g2, 1, %o0
@@ -68,7 +68,7 @@ test_and_change_bit:	/* %o0=nr, %o1=addr */
 	xor	%g7, %o2, %g1
 	xor	%g7, %o2, %g1
 	casx	[%o1], %g7, %g1
 	casx	[%o1], %g7, %g1
 	cmp	%g7, %g1
 	cmp	%g7, %g1
-	bne,pn	%xcc, 2f
+	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
 	 and	%g7, %o2, %g2
 	 and	%g7, %o2, %g2
 	clr	%o0
 	clr	%o0
 	movrne	%g2, 1, %o0
 	movrne	%g2, 1, %o0
@@ -91,7 +91,7 @@ set_bit:		/* %o0=nr, %o1=addr */
 	or	%g7, %o2, %g1
 	or	%g7, %o2, %g1
 	casx	[%o1], %g7, %g1
 	casx	[%o1], %g7, %g1
 	cmp	%g7, %g1
 	cmp	%g7, %g1
-	bne,pn	%xcc, 2f
+	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
 	 nop
 	 nop
 	retl
 	retl
 	 nop
 	 nop
@@ -112,7 +112,7 @@ clear_bit:		/* %o0=nr, %o1=addr */
 	andn	%g7, %o2, %g1
 	andn	%g7, %o2, %g1
 	casx	[%o1], %g7, %g1
 	casx	[%o1], %g7, %g1
 	cmp	%g7, %g1
 	cmp	%g7, %g1
-	bne,pn	%xcc, 2f
+	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
 	 nop
 	 nop
 	retl
 	retl
 	 nop
 	 nop
@@ -133,7 +133,7 @@ change_bit:		/* %o0=nr, %o1=addr */
 	xor	%g7, %o2, %g1
 	xor	%g7, %o2, %g1
 	casx	[%o1], %g7, %g1
 	casx	[%o1], %g7, %g1
 	cmp	%g7, %g1
 	cmp	%g7, %g1
-	bne,pn	%xcc, 2f
+	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
 	 nop
 	 nop
 	retl
 	retl
 	 nop
 	 nop