diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2005-09-01 18:02:27 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-09-01 18:02:27 -0400 |
| commit | ceeec3dc375e3b0618f16b34efc56fe093918f8b (patch) | |
| tree | 2293d02721ee05131aaf1c60e4fba7e281585eec /arch/sparc64/lib/debuglocks.c | |
| parent | fbff868db3a4cc6a89d51da9a6d49b26c29d04fb (diff) | |
| parent | e3ee3b78f83688a0ae4315e8be71b2eac559904a (diff) | |
/spare/repo/netdev-2.6 branch 'ieee80211'
Diffstat (limited to 'arch/sparc64/lib/debuglocks.c')
| -rw-r--r-- | arch/sparc64/lib/debuglocks.c | 56 |
1 files changed, 22 insertions, 34 deletions
diff --git a/arch/sparc64/lib/debuglocks.c b/arch/sparc64/lib/debuglocks.c index f03344cf784e..f5f0b5586f01 100644 --- a/arch/sparc64/lib/debuglocks.c +++ b/arch/sparc64/lib/debuglocks.c | |||
| @@ -12,8 +12,6 @@ | |||
| 12 | 12 | ||
| 13 | #ifdef CONFIG_SMP | 13 | #ifdef CONFIG_SMP |
| 14 | 14 | ||
| 15 | #define GET_CALLER(PC) __asm__ __volatile__("mov %%i7, %0" : "=r" (PC)) | ||
| 16 | |||
| 17 | static inline void show (char *str, spinlock_t *lock, unsigned long caller) | 15 | static inline void show (char *str, spinlock_t *lock, unsigned long caller) |
| 18 | { | 16 | { |
| 19 | int cpu = smp_processor_id(); | 17 | int cpu = smp_processor_id(); |
| @@ -51,20 +49,19 @@ static inline void show_write (char *str, rwlock_t *lock, unsigned long caller) | |||
| 51 | #undef INIT_STUCK | 49 | #undef INIT_STUCK |
| 52 | #define INIT_STUCK 100000000 | 50 | #define INIT_STUCK 100000000 |
| 53 | 51 | ||
| 54 | void _do_spin_lock(spinlock_t *lock, char *str) | 52 | void _do_spin_lock(spinlock_t *lock, char *str, unsigned long caller) |
| 55 | { | 53 | { |
| 56 | unsigned long caller, val; | 54 | unsigned long val; |
| 57 | int stuck = INIT_STUCK; | 55 | int stuck = INIT_STUCK; |
| 58 | int cpu = get_cpu(); | 56 | int cpu = get_cpu(); |
| 59 | int shown = 0; | 57 | int shown = 0; |
| 60 | 58 | ||
| 61 | GET_CALLER(caller); | ||
| 62 | again: | 59 | again: |
| 63 | __asm__ __volatile__("ldstub [%1], %0" | 60 | __asm__ __volatile__("ldstub [%1], %0" |
| 64 | : "=r" (val) | 61 | : "=r" (val) |
| 65 | : "r" (&(lock->lock)) | 62 | : "r" (&(lock->lock)) |
| 66 | : "memory"); | 63 | : "memory"); |
| 67 | membar("#StoreLoad | #StoreStore"); | 64 | membar_storeload_storestore(); |
| 68 | if (val) { | 65 | if (val) { |
| 69 | while (lock->lock) { | 66 | while (lock->lock) { |
| 70 | if (!--stuck) { | 67 | if (!--stuck) { |
| @@ -72,7 +69,7 @@ again: | |||
| 72 | show(str, lock, caller); | 69 | show(str, lock, caller); |
| 73 | stuck = INIT_STUCK; | 70 | stuck = INIT_STUCK; |
| 74 | } | 71 | } |
| 75 | membar("#LoadLoad"); | 72 | rmb(); |
| 76 | } | 73 | } |
| 77 | goto again; | 74 | goto again; |
| 78 | } | 75 | } |
| @@ -84,17 +81,16 @@ again: | |||
| 84 | put_cpu(); | 81 | put_cpu(); |
| 85 | } | 82 | } |
| 86 | 83 | ||
| 87 | int _do_spin_trylock(spinlock_t *lock) | 84 | int _do_spin_trylock(spinlock_t *lock, unsigned long caller) |
| 88 | { | 85 | { |
| 89 | unsigned long val, caller; | 86 | unsigned long val; |
| 90 | int cpu = get_cpu(); | 87 | int cpu = get_cpu(); |
| 91 | 88 | ||
| 92 | GET_CALLER(caller); | ||
| 93 | __asm__ __volatile__("ldstub [%1], %0" | 89 | __asm__ __volatile__("ldstub [%1], %0" |
| 94 | : "=r" (val) | 90 | : "=r" (val) |
| 95 | : "r" (&(lock->lock)) | 91 | : "r" (&(lock->lock)) |
| 96 | : "memory"); | 92 | : "memory"); |
| 97 | membar("#StoreLoad | #StoreStore"); | 93 | membar_storeload_storestore(); |
| 98 | if (!val) { | 94 | if (!val) { |
| 99 | lock->owner_pc = ((unsigned int)caller); | 95 | lock->owner_pc = ((unsigned int)caller); |
| 100 | lock->owner_cpu = cpu; | 96 | lock->owner_cpu = cpu; |
| @@ -111,21 +107,20 @@ void _do_spin_unlock(spinlock_t *lock) | |||
| 111 | { | 107 | { |
| 112 | lock->owner_pc = 0; | 108 | lock->owner_pc = 0; |
| 113 | lock->owner_cpu = NO_PROC_ID; | 109 | lock->owner_cpu = NO_PROC_ID; |
| 114 | membar("#StoreStore | #LoadStore"); | 110 | membar_storestore_loadstore(); |
| 115 | lock->lock = 0; | 111 | lock->lock = 0; |
| 116 | current->thread.smp_lock_count--; | 112 | current->thread.smp_lock_count--; |
| 117 | } | 113 | } |
| 118 | 114 | ||
| 119 | /* Keep INIT_STUCK the same... */ | 115 | /* Keep INIT_STUCK the same... */ |
| 120 | 116 | ||
| 121 | void _do_read_lock (rwlock_t *rw, char *str) | 117 | void _do_read_lock(rwlock_t *rw, char *str, unsigned long caller) |
| 122 | { | 118 | { |
| 123 | unsigned long caller, val; | 119 | unsigned long val; |
| 124 | int stuck = INIT_STUCK; | 120 | int stuck = INIT_STUCK; |
| 125 | int cpu = get_cpu(); | 121 | int cpu = get_cpu(); |
| 126 | int shown = 0; | 122 | int shown = 0; |
| 127 | 123 | ||
| 128 | GET_CALLER(caller); | ||
| 129 | wlock_again: | 124 | wlock_again: |
| 130 | /* Wait for any writer to go away. */ | 125 | /* Wait for any writer to go away. */ |
| 131 | while (((long)(rw->lock)) < 0) { | 126 | while (((long)(rw->lock)) < 0) { |
| @@ -134,7 +129,7 @@ wlock_again: | |||
| 134 | show_read(str, rw, caller); | 129 | show_read(str, rw, caller); |
| 135 | stuck = INIT_STUCK; | 130 | stuck = INIT_STUCK; |
| 136 | } | 131 | } |
| 137 | membar("#LoadLoad"); | 132 | rmb(); |
| 138 | } | 133 | } |
| 139 | /* Try once to increment the counter. */ | 134 | /* Try once to increment the counter. */ |
| 140 | __asm__ __volatile__( | 135 | __asm__ __volatile__( |
| @@ -147,7 +142,7 @@ wlock_again: | |||
| 147 | "2:" : "=r" (val) | 142 | "2:" : "=r" (val) |
| 148 | : "0" (&(rw->lock)) | 143 | : "0" (&(rw->lock)) |
| 149 | : "g1", "g7", "memory"); | 144 | : "g1", "g7", "memory"); |
| 150 | membar("#StoreLoad | #StoreStore"); | 145 | membar_storeload_storestore(); |
| 151 | if (val) | 146 | if (val) |
| 152 | goto wlock_again; | 147 | goto wlock_again; |
| 153 | rw->reader_pc[cpu] = ((unsigned int)caller); | 148 | rw->reader_pc[cpu] = ((unsigned int)caller); |
| @@ -157,15 +152,13 @@ wlock_again: | |||
| 157 | put_cpu(); | 152 | put_cpu(); |
| 158 | } | 153 | } |
| 159 | 154 | ||
| 160 | void _do_read_unlock (rwlock_t *rw, char *str) | 155 | void _do_read_unlock(rwlock_t *rw, char *str, unsigned long caller) |
| 161 | { | 156 | { |
| 162 | unsigned long caller, val; | 157 | unsigned long val; |
| 163 | int stuck = INIT_STUCK; | 158 | int stuck = INIT_STUCK; |
| 164 | int cpu = get_cpu(); | 159 | int cpu = get_cpu(); |
| 165 | int shown = 0; | 160 | int shown = 0; |
| 166 | 161 | ||
| 167 | GET_CALLER(caller); | ||
| 168 | |||
| 169 | /* Drop our identity _first_. */ | 162 | /* Drop our identity _first_. */ |
| 170 | rw->reader_pc[cpu] = 0; | 163 | rw->reader_pc[cpu] = 0; |
| 171 | current->thread.smp_lock_count--; | 164 | current->thread.smp_lock_count--; |
| @@ -193,14 +186,13 @@ runlock_again: | |||
| 193 | put_cpu(); | 186 | put_cpu(); |
| 194 | } | 187 | } |
| 195 | 188 | ||
| 196 | void _do_write_lock (rwlock_t *rw, char *str) | 189 | void _do_write_lock(rwlock_t *rw, char *str, unsigned long caller) |
| 197 | { | 190 | { |
| 198 | unsigned long caller, val; | 191 | unsigned long val; |
| 199 | int stuck = INIT_STUCK; | 192 | int stuck = INIT_STUCK; |
| 200 | int cpu = get_cpu(); | 193 | int cpu = get_cpu(); |
| 201 | int shown = 0; | 194 | int shown = 0; |
| 202 | 195 | ||
| 203 | GET_CALLER(caller); | ||
| 204 | wlock_again: | 196 | wlock_again: |
| 205 | /* Spin while there is another writer. */ | 197 | /* Spin while there is another writer. */ |
| 206 | while (((long)rw->lock) < 0) { | 198 | while (((long)rw->lock) < 0) { |
| @@ -209,7 +201,7 @@ wlock_again: | |||
| 209 | show_write(str, rw, caller); | 201 | show_write(str, rw, caller); |
| 210 | stuck = INIT_STUCK; | 202 | stuck = INIT_STUCK; |
| 211 | } | 203 | } |
| 212 | membar("#LoadLoad"); | 204 | rmb(); |
| 213 | } | 205 | } |
| 214 | 206 | ||
| 215 | /* Try to acuire the write bit. */ | 207 | /* Try to acuire the write bit. */ |
| @@ -264,7 +256,7 @@ wlock_again: | |||
| 264 | show_write(str, rw, caller); | 256 | show_write(str, rw, caller); |
| 265 | stuck = INIT_STUCK; | 257 | stuck = INIT_STUCK; |
| 266 | } | 258 | } |
| 267 | membar("#LoadLoad"); | 259 | rmb(); |
| 268 | } | 260 | } |
| 269 | goto wlock_again; | 261 | goto wlock_again; |
| 270 | } | 262 | } |
| @@ -278,14 +270,12 @@ wlock_again: | |||
| 278 | put_cpu(); | 270 | put_cpu(); |
| 279 | } | 271 | } |
| 280 | 272 | ||
| 281 | void _do_write_unlock(rwlock_t *rw) | 273 | void _do_write_unlock(rwlock_t *rw, unsigned long caller) |
| 282 | { | 274 | { |
| 283 | unsigned long caller, val; | 275 | unsigned long val; |
| 284 | int stuck = INIT_STUCK; | 276 | int stuck = INIT_STUCK; |
| 285 | int shown = 0; | 277 | int shown = 0; |
| 286 | 278 | ||
| 287 | GET_CALLER(caller); | ||
| 288 | |||
| 289 | /* Drop our identity _first_ */ | 279 | /* Drop our identity _first_ */ |
| 290 | rw->writer_pc = 0; | 280 | rw->writer_pc = 0; |
| 291 | rw->writer_cpu = NO_PROC_ID; | 281 | rw->writer_cpu = NO_PROC_ID; |
| @@ -313,13 +303,11 @@ wlock_again: | |||
| 313 | } | 303 | } |
| 314 | } | 304 | } |
| 315 | 305 | ||
| 316 | int _do_write_trylock (rwlock_t *rw, char *str) | 306 | int _do_write_trylock(rwlock_t *rw, char *str, unsigned long caller) |
| 317 | { | 307 | { |
| 318 | unsigned long caller, val; | 308 | unsigned long val; |
| 319 | int cpu = get_cpu(); | 309 | int cpu = get_cpu(); |
| 320 | 310 | ||
| 321 | GET_CALLER(caller); | ||
| 322 | |||
| 323 | /* Try to acuire the write bit. */ | 311 | /* Try to acuire the write bit. */ |
| 324 | __asm__ __volatile__( | 312 | __asm__ __volatile__( |
| 325 | " mov 1, %%g3\n" | 313 | " mov 1, %%g3\n" |
