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