Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

powerpc: Merge spinlock.h

The result is mostly similar to the original ppc64 version but with
some adaptations for 32-bit compilation.

include/asm-ppc64 is now empty!

Signed-off-by: Paul Mackerras <paulus@samba.org>

+50 -22
+50 -22
include/asm-ppc64/spinlock.h include/asm-powerpc/spinlock.h
··· 18 18 * 19 19 * (the type definitions are in asm/spinlock_types.h) 20 20 */ 21 - #include <linux/config.h> 21 + #ifdef CONFIG_PPC64 22 22 #include <asm/paca.h> 23 23 #include <asm/hvcall.h> 24 24 #include <asm/iseries/hv_call.h> 25 + #endif 26 + #include <asm/asm-compat.h> 27 + #include <asm/synch.h> 25 28 26 29 #define __raw_spin_is_locked(x) ((x)->slock != 0) 30 + 31 + #ifdef CONFIG_PPC64 32 + /* use 0x800000yy when locked, where yy == CPU number */ 33 + #define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token)) 34 + #else 35 + #define LOCK_TOKEN 1 36 + #endif 27 37 28 38 /* 29 39 * This returns the old value in the lock, so we succeeded ··· 41 31 */ 42 32 static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock) 43 33 { 44 - unsigned long tmp, tmp2; 34 + unsigned long tmp, token; 45 35 36 + token = LOCK_TOKEN; 46 37 __asm__ __volatile__( 47 - " lwz %1,%3(13) # __spin_trylock\n\ 48 - 1: lwarx %0,0,%2\n\ 38 + "1: lwarx %0,0,%2 # __spin_trylock\n\ 49 39 cmpwi 0,%0,0\n\ 50 40 bne- 2f\n\ 51 41 stwcx. %1,0,%2\n\ 52 42 bne- 1b\n\ 53 43 isync\n\ 54 - 2:" : "=&r" (tmp), "=&r" (tmp2) 55 - : "r" (&lock->slock), "i" (offsetof(struct paca_struct, lock_token)) 44 + 2:" : "=&r" (tmp) 45 + : "r" (token), "r" (&lock->slock) 56 46 : "cr0", "memory"); 57 47 58 48 return tmp; ··· 123 113 124 114 static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock) 125 115 { 126 - __asm__ __volatile__("lwsync # __raw_spin_unlock": : :"memory"); 116 + __asm__ __volatile__(SYNC_ON_SMP" # __raw_spin_unlock" 117 + : : :"memory"); 127 118 lock->slock = 0; 128 119 } 129 120 121 + #ifdef CONFIG_PPC64 130 122 extern void __raw_spin_unlock_wait(raw_spinlock_t *lock); 123 + #else 124 + #define __raw_spin_unlock_wait(lock) \ 125 + do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0) 126 + #endif 131 127 132 128 /* 133 129 * Read-write spinlocks, allowing multiple readers ··· 149 133 #define __raw_read_can_lock(rw) ((rw)->lock >= 0) 150 134 #define __raw_write_can_lock(rw) (!(rw)->lock) 151 135 136 + #ifdef CONFIG_PPC64 137 + #define __DO_SIGN_EXTEND "extsw %0,%0\n" 138 + #define WRLOCK_TOKEN LOCK_TOKEN /* it's negative */ 139 + #else 140 + #define __DO_SIGN_EXTEND 141 + #define WRLOCK_TOKEN (-1) 142 + #endif 143 + 152 144 /* 153 145 * This returns the old value in the lock + 1, 154 146 * so we got a read lock if the return value is > 0. ··· 166 142 long tmp; 167 143 168 144 __asm__ __volatile__( 169 - "1: lwarx %0,0,%1 # read_trylock\n\ 170 - extsw %0,%0\n\ 171 - addic. %0,%0,1\n\ 172 - ble- 2f\n\ 173 - stwcx. %0,0,%1\n\ 145 + "1: lwarx %0,0,%1 # read_trylock\n" 146 + __DO_SIGN_EXTEND 147 + " addic. %0,%0,1\n\ 148 + ble- 2f\n" 149 + PPC405_ERR77(0,%1) 150 + " stwcx. %0,0,%1\n\ 174 151 bne- 1b\n\ 175 152 isync\n\ 176 153 2:" : "=&r" (tmp) ··· 187 162 */ 188 163 static __inline__ long __write_trylock(raw_rwlock_t *rw) 189 164 { 190 - long tmp, tmp2; 165 + long tmp, token; 191 166 167 + token = WRLOCK_TOKEN; 192 168 __asm__ __volatile__( 193 - " lwz %1,%3(13) # write_trylock\n\ 194 - 1: lwarx %0,0,%2\n\ 169 + "1: lwarx %0,0,%2 # write_trylock\n\ 195 170 cmpwi 0,%0,0\n\ 196 - bne- 2f\n\ 197 - stwcx. %1,0,%2\n\ 171 + bne- 2f\n" 172 + PPC405_ERR77(0,%1) 173 + " stwcx. %1,0,%2\n\ 198 174 bne- 1b\n\ 199 175 isync\n\ 200 - 2:" : "=&r" (tmp), "=&r" (tmp2) 201 - : "r" (&rw->lock), "i" (offsetof(struct paca_struct, lock_token)) 176 + 2:" : "=&r" (tmp) 177 + : "r" (token), "r" (&rw->lock) 202 178 : "cr0", "memory"); 203 179 204 180 return tmp; ··· 250 224 __asm__ __volatile__( 251 225 "eieio # read_unlock\n\ 252 226 1: lwarx %0,0,%1\n\ 253 - addic %0,%0,-1\n\ 254 - stwcx. %0,0,%1\n\ 227 + addic %0,%0,-1\n" 228 + PPC405_ERR77(0,%1) 229 + " stwcx. %0,0,%1\n\ 255 230 bne- 1b" 256 231 : "=&r"(tmp) 257 232 : "r"(&rw->lock) ··· 261 234 262 235 static __inline__ void __raw_write_unlock(raw_rwlock_t *rw) 263 236 { 264 - __asm__ __volatile__("lwsync # write_unlock": : :"memory"); 237 + __asm__ __volatile__(SYNC_ON_SMP" # write_unlock" 238 + : : :"memory"); 265 239 rw->lock = 0; 266 240 } 267 241