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>

+22 -17
+8 -3
arch/sparc/include/asm/backoff.h
··· 8 8 #define BACKOFF_SETUP(reg) \ 9 9 mov 1, reg 10 10 11 + #define BACKOFF_LABEL(spin_label, continue_label) \ 12 + spin_label 13 + 11 14 #define BACKOFF_SPIN(reg, tmp, label) \ 12 15 mov reg, tmp; \ 13 16 88: brnz,pt tmp, 88b; \ ··· 25 22 #else 26 23 27 24 #define BACKOFF_SETUP(reg) 28 - #define BACKOFF_SPIN(reg, tmp, label) \ 29 - ba,pt %xcc, label; \ 30 - nop; 25 + 26 + #define BACKOFF_LABEL(spin_label, continue_label) \ 27 + continue_label 28 + 29 + #define BACKOFF_SPIN(reg, tmp, label) 31 30 32 31 #endif 33 32
+8 -8
arch/sparc/lib/atomic_64.S
··· 21 21 add %g1, %o0, %g7 22 22 cas [%o1], %g1, %g7 23 23 cmp %g1, %g7 24 - bne,pn %icc, 2f 24 + bne,pn %icc, BACKOFF_LABEL(2f, 1b) 25 25 nop 26 26 retl 27 27 nop ··· 36 36 sub %g1, %o0, %g7 37 37 cas [%o1], %g1, %g7 38 38 cmp %g1, %g7 39 - bne,pn %icc, 2f 39 + bne,pn %icc, BACKOFF_LABEL(2f, 1b) 40 40 nop 41 41 retl 42 42 nop ··· 51 51 add %g1, %o0, %g7 52 52 cas [%o1], %g1, %g7 53 53 cmp %g1, %g7 54 - bne,pn %icc, 2f 54 + bne,pn %icc, BACKOFF_LABEL(2f, 1b) 55 55 add %g1, %o0, %g1 56 56 retl 57 57 sra %g1, 0, %o0 ··· 66 66 sub %g1, %o0, %g7 67 67 cas [%o1], %g1, %g7 68 68 cmp %g1, %g7 69 - bne,pn %icc, 2f 69 + bne,pn %icc, BACKOFF_LABEL(2f, 1b) 70 70 sub %g1, %o0, %g1 71 71 retl 72 72 sra %g1, 0, %o0 ··· 81 81 add %g1, %o0, %g7 82 82 casx [%o1], %g1, %g7 83 83 cmp %g1, %g7 84 - bne,pn %xcc, 2f 84 + bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 85 85 nop 86 86 retl 87 87 nop ··· 96 96 sub %g1, %o0, %g7 97 97 casx [%o1], %g1, %g7 98 98 cmp %g1, %g7 99 - bne,pn %xcc, 2f 99 + bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 100 100 nop 101 101 retl 102 102 nop ··· 111 111 add %g1, %o0, %g7 112 112 casx [%o1], %g1, %g7 113 113 cmp %g1, %g7 114 - bne,pn %xcc, 2f 114 + bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 115 115 nop 116 116 retl 117 117 add %g1, %o0, %o0 ··· 126 126 sub %g1, %o0, %g7 127 127 casx [%o1], %g1, %g7 128 128 cmp %g1, %g7 129 - bne,pn %xcc, 2f 129 + bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 130 130 nop 131 131 retl 132 132 sub %g1, %o0, %o0
+6 -6
arch/sparc/lib/bitops.S
··· 22 22 or %g7, %o2, %g1 23 23 casx [%o1], %g7, %g1 24 24 cmp %g7, %g1 25 - bne,pn %xcc, 2f 25 + bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 26 26 and %g7, %o2, %g2 27 27 clr %o0 28 28 movrne %g2, 1, %o0 ··· 45 45 andn %g7, %o2, %g1 46 46 casx [%o1], %g7, %g1 47 47 cmp %g7, %g1 48 - bne,pn %xcc, 2f 48 + bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 49 49 and %g7, %o2, %g2 50 50 clr %o0 51 51 movrne %g2, 1, %o0 ··· 68 68 xor %g7, %o2, %g1 69 69 casx [%o1], %g7, %g1 70 70 cmp %g7, %g1 71 - bne,pn %xcc, 2f 71 + bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 72 72 and %g7, %o2, %g2 73 73 clr %o0 74 74 movrne %g2, 1, %o0 ··· 91 91 or %g7, %o2, %g1 92 92 casx [%o1], %g7, %g1 93 93 cmp %g7, %g1 94 - bne,pn %xcc, 2f 94 + bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 95 95 nop 96 96 retl 97 97 nop ··· 112 112 andn %g7, %o2, %g1 113 113 casx [%o1], %g7, %g1 114 114 cmp %g7, %g1 115 - bne,pn %xcc, 2f 115 + bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 116 116 nop 117 117 retl 118 118 nop ··· 133 133 xor %g7, %o2, %g1 134 134 casx [%o1], %g7, %g1 135 135 cmp %g7, %g1 136 - bne,pn %xcc, 2f 136 + bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 137 137 nop 138 138 retl 139 139 nop