diff options
Diffstat (limited to 'lib/rwsem.c')
| -rw-r--r-- | lib/rwsem.c | 51 |
1 files changed, 20 insertions, 31 deletions
diff --git a/lib/rwsem.c b/lib/rwsem.c index 62fa4eba9ffe..b322421c2969 100644 --- a/lib/rwsem.c +++ b/lib/rwsem.c | |||
| @@ -8,6 +8,26 @@ | |||
| 8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
| 9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 10 | 10 | ||
| 11 | /* | ||
| 12 | * Initialize an rwsem: | ||
| 13 | */ | ||
| 14 | void __init_rwsem(struct rw_semaphore *sem, const char *name, | ||
| 15 | struct lock_class_key *key) | ||
| 16 | { | ||
| 17 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 18 | /* | ||
| 19 | * Make sure we are not reinitializing a held semaphore: | ||
| 20 | */ | ||
| 21 | debug_check_no_locks_freed((void *)sem, sizeof(*sem)); | ||
| 22 | lockdep_init_map(&sem->dep_map, name, key); | ||
| 23 | #endif | ||
| 24 | sem->count = RWSEM_UNLOCKED_VALUE; | ||
| 25 | spin_lock_init(&sem->wait_lock); | ||
| 26 | INIT_LIST_HEAD(&sem->wait_list); | ||
| 27 | } | ||
| 28 | |||
| 29 | EXPORT_SYMBOL(__init_rwsem); | ||
| 30 | |||
| 11 | struct rwsem_waiter { | 31 | struct rwsem_waiter { |
| 12 | struct list_head list; | 32 | struct list_head list; |
| 13 | struct task_struct *task; | 33 | struct task_struct *task; |
| @@ -16,17 +36,6 @@ struct rwsem_waiter { | |||
| 16 | #define RWSEM_WAITING_FOR_WRITE 0x00000002 | 36 | #define RWSEM_WAITING_FOR_WRITE 0x00000002 |
| 17 | }; | 37 | }; |
| 18 | 38 | ||
| 19 | #if RWSEM_DEBUG | ||
| 20 | #undef rwsemtrace | ||
| 21 | void rwsemtrace(struct rw_semaphore *sem, const char *str) | ||
| 22 | { | ||
| 23 | printk("sem=%p\n", sem); | ||
| 24 | printk("(sem)=%08lx\n", sem->count); | ||
| 25 | if (sem->debug) | ||
| 26 | printk("[%d] %s({%08lx})\n", current->pid, str, sem->count); | ||
| 27 | } | ||
| 28 | #endif | ||
| 29 | |||
| 30 | /* | 39 | /* |
| 31 | * handle the lock release when processes blocked on it that can now run | 40 | * handle the lock release when processes blocked on it that can now run |
| 32 | * - if we come here from up_xxxx(), then: | 41 | * - if we come here from up_xxxx(), then: |
| @@ -45,8 +54,6 @@ __rwsem_do_wake(struct rw_semaphore *sem, int downgrading) | |||
| 45 | struct list_head *next; | 54 | struct list_head *next; |
| 46 | signed long oldcount, woken, loop; | 55 | signed long oldcount, woken, loop; |
| 47 | 56 | ||
| 48 | rwsemtrace(sem, "Entering __rwsem_do_wake"); | ||
| 49 | |||
| 50 | if (downgrading) | 57 | if (downgrading) |
| 51 | goto dont_wake_writers; | 58 | goto dont_wake_writers; |
| 52 | 59 | ||
| @@ -127,7 +134,6 @@ __rwsem_do_wake(struct rw_semaphore *sem, int downgrading) | |||
| 127 | next->prev = &sem->wait_list; | 134 | next->prev = &sem->wait_list; |
| 128 | 135 | ||
| 129 | out: | 136 | out: |
| 130 | rwsemtrace(sem, "Leaving __rwsem_do_wake"); | ||
| 131 | return sem; | 137 | return sem; |
| 132 | 138 | ||
| 133 | /* undo the change to count, but check for a transition 1->0 */ | 139 | /* undo the change to count, but check for a transition 1->0 */ |
| @@ -186,13 +192,9 @@ rwsem_down_read_failed(struct rw_semaphore *sem) | |||
| 186 | { | 192 | { |
| 187 | struct rwsem_waiter waiter; | 193 | struct rwsem_waiter waiter; |
| 188 | 194 | ||
| 189 | rwsemtrace(sem, "Entering rwsem_down_read_failed"); | ||
| 190 | |||
| 191 | waiter.flags = RWSEM_WAITING_FOR_READ; | 195 | waiter.flags = RWSEM_WAITING_FOR_READ; |
| 192 | rwsem_down_failed_common(sem, &waiter, | 196 | rwsem_down_failed_common(sem, &waiter, |
| 193 | RWSEM_WAITING_BIAS - RWSEM_ACTIVE_BIAS); | 197 | RWSEM_WAITING_BIAS - RWSEM_ACTIVE_BIAS); |
| 194 | |||
| 195 | rwsemtrace(sem, "Leaving rwsem_down_read_failed"); | ||
| 196 | return sem; | 198 | return sem; |
| 197 | } | 199 | } |
| 198 | 200 | ||
| @@ -204,12 +206,9 @@ rwsem_down_write_failed(struct rw_semaphore *sem) | |||
| 204 | { | 206 | { |
| 205 | struct rwsem_waiter waiter; | 207 | struct rwsem_waiter waiter; |
| 206 | 208 | ||
| 207 | rwsemtrace(sem, "Entering rwsem_down_write_failed"); | ||
| 208 | |||
| 209 | waiter.flags = RWSEM_WAITING_FOR_WRITE; | 209 | waiter.flags = RWSEM_WAITING_FOR_WRITE; |
| 210 | rwsem_down_failed_common(sem, &waiter, -RWSEM_ACTIVE_BIAS); | 210 | rwsem_down_failed_common(sem, &waiter, -RWSEM_ACTIVE_BIAS); |
| 211 | 211 | ||
| 212 | rwsemtrace(sem, "Leaving rwsem_down_write_failed"); | ||
| 213 | return sem; | 212 | return sem; |
| 214 | } | 213 | } |
| 215 | 214 | ||
| @@ -221,8 +220,6 @@ struct rw_semaphore fastcall *rwsem_wake(struct rw_semaphore *sem) | |||
| 221 | { | 220 | { |
| 222 | unsigned long flags; | 221 | unsigned long flags; |
| 223 | 222 | ||
| 224 | rwsemtrace(sem, "Entering rwsem_wake"); | ||
| 225 | |||
| 226 | spin_lock_irqsave(&sem->wait_lock, flags); | 223 | spin_lock_irqsave(&sem->wait_lock, flags); |
| 227 | 224 | ||
| 228 | /* do nothing if list empty */ | 225 | /* do nothing if list empty */ |
| @@ -231,8 +228,6 @@ struct rw_semaphore fastcall *rwsem_wake(struct rw_semaphore *sem) | |||
| 231 | 228 | ||
| 232 | spin_unlock_irqrestore(&sem->wait_lock, flags); | 229 | spin_unlock_irqrestore(&sem->wait_lock, flags); |
| 233 | 230 | ||
| 234 | rwsemtrace(sem, "Leaving rwsem_wake"); | ||
| 235 | |||
| 236 | return sem; | 231 | return sem; |
| 237 | } | 232 | } |
| 238 | 233 | ||
| @@ -245,8 +240,6 @@ struct rw_semaphore fastcall *rwsem_downgrade_wake(struct rw_semaphore *sem) | |||
| 245 | { | 240 | { |
| 246 | unsigned long flags; | 241 | unsigned long flags; |
| 247 | 242 | ||
| 248 | rwsemtrace(sem, "Entering rwsem_downgrade_wake"); | ||
| 249 | |||
| 250 | spin_lock_irqsave(&sem->wait_lock, flags); | 243 | spin_lock_irqsave(&sem->wait_lock, flags); |
| 251 | 244 | ||
| 252 | /* do nothing if list empty */ | 245 | /* do nothing if list empty */ |
| @@ -255,7 +248,6 @@ struct rw_semaphore fastcall *rwsem_downgrade_wake(struct rw_semaphore *sem) | |||
| 255 | 248 | ||
| 256 | spin_unlock_irqrestore(&sem->wait_lock, flags); | 249 | spin_unlock_irqrestore(&sem->wait_lock, flags); |
| 257 | 250 | ||
| 258 | rwsemtrace(sem, "Leaving rwsem_downgrade_wake"); | ||
| 259 | return sem; | 251 | return sem; |
| 260 | } | 252 | } |
| 261 | 253 | ||
| @@ -263,6 +255,3 @@ EXPORT_SYMBOL(rwsem_down_read_failed); | |||
| 263 | EXPORT_SYMBOL(rwsem_down_write_failed); | 255 | EXPORT_SYMBOL(rwsem_down_write_failed); |
| 264 | EXPORT_SYMBOL(rwsem_wake); | 256 | EXPORT_SYMBOL(rwsem_wake); |
| 265 | EXPORT_SYMBOL(rwsem_downgrade_wake); | 257 | EXPORT_SYMBOL(rwsem_downgrade_wake); |
| 266 | #if RWSEM_DEBUG | ||
| 267 | EXPORT_SYMBOL(rwsemtrace); | ||
| 268 | #endif | ||
