Blame view
kernel/rwsem.c
2.82 KB
c4e05116a [PATCH] lockdep: ... |
1 2 3 4 5 6 7 8 |
/* kernel/rwsem.c: R/W semaphores, public implementation * * Written by David Howells (dhowells@redhat.com). * Derived from asm-i386/semaphore.h */ #include <linux/types.h> #include <linux/kernel.h> |
c7af77b58 sched: mark rwsem... |
9 |
#include <linux/sched.h> |
9984de1a5 kernel: Map most ... |
10 |
#include <linux/export.h> |
c4e05116a [PATCH] lockdep: ... |
11 |
#include <linux/rwsem.h> |
60063497a atomic: use <linu... |
12 |
#include <linux/atomic.h> |
c4e05116a [PATCH] lockdep: ... |
13 14 15 16 |
/* * lock for reading */ |
c7af77b58 sched: mark rwsem... |
17 |
void __sched down_read(struct rw_semaphore *sem) |
c4e05116a [PATCH] lockdep: ... |
18 19 20 |
{ might_sleep(); rwsem_acquire_read(&sem->dep_map, 0, 0, _RET_IP_); |
4fe87745a lockstat: hook in... |
21 |
LOCK_CONTENDED(sem, __down_read_trylock, __down_read); |
c4e05116a [PATCH] lockdep: ... |
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
} EXPORT_SYMBOL(down_read); /* * trylock for reading -- returns 1 if successful, 0 if contention */ int down_read_trylock(struct rw_semaphore *sem) { int ret = __down_read_trylock(sem); if (ret == 1) rwsem_acquire_read(&sem->dep_map, 0, 1, _RET_IP_); return ret; } EXPORT_SYMBOL(down_read_trylock); /* * lock for writing */ |
c7af77b58 sched: mark rwsem... |
43 |
void __sched down_write(struct rw_semaphore *sem) |
c4e05116a [PATCH] lockdep: ... |
44 45 46 |
{ might_sleep(); rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_); |
4fe87745a lockstat: hook in... |
47 |
LOCK_CONTENDED(sem, __down_write_trylock, __down_write); |
c4e05116a [PATCH] lockdep: ... |
48 49 50 51 52 53 54 55 56 57 58 59 |
} EXPORT_SYMBOL(down_write); /* * trylock for writing -- returns 1 if successful, 0 if contention */ int down_write_trylock(struct rw_semaphore *sem) { int ret = __down_write_trylock(sem); if (ret == 1) |
428e6ce02 Lockdep treats do... |
60 |
rwsem_acquire(&sem->dep_map, 0, 1, _RET_IP_); |
c4e05116a [PATCH] lockdep: ... |
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
return ret; } EXPORT_SYMBOL(down_write_trylock); /* * release a read lock */ void up_read(struct rw_semaphore *sem) { rwsem_release(&sem->dep_map, 1, _RET_IP_); __up_read(sem); } EXPORT_SYMBOL(up_read); /* * release a write lock */ void up_write(struct rw_semaphore *sem) { rwsem_release(&sem->dep_map, 1, _RET_IP_); __up_write(sem); } EXPORT_SYMBOL(up_write); /* * downgrade write lock to read lock */ void downgrade_write(struct rw_semaphore *sem) { /* * lockdep: a downgraded write will live on as a write * dependency. */ __downgrade_write(sem); } EXPORT_SYMBOL(downgrade_write); |
4ea2176df [PATCH] lockdep: ... |
103 104 105 106 107 108 109 |
#ifdef CONFIG_DEBUG_LOCK_ALLOC void down_read_nested(struct rw_semaphore *sem, int subclass) { might_sleep(); rwsem_acquire_read(&sem->dep_map, subclass, 0, _RET_IP_); |
4fe87745a lockstat: hook in... |
110 |
LOCK_CONTENDED(sem, __down_read_trylock, __down_read); |
4ea2176df [PATCH] lockdep: ... |
111 112 113 |
} EXPORT_SYMBOL(down_read_nested); |
1b963c81b lockdep, rwsem: p... |
114 115 116 117 118 119 120 121 122 |
void _down_write_nest_lock(struct rw_semaphore *sem, struct lockdep_map *nest) { might_sleep(); rwsem_acquire_nest(&sem->dep_map, 0, 0, nest, _RET_IP_); LOCK_CONTENDED(sem, __down_write_trylock, __down_write); } EXPORT_SYMBOL(_down_write_nest_lock); |
84759c6d1 Revert "rw_semaph... |
123 124 125 126 127 128 129 130 |
void down_read_non_owner(struct rw_semaphore *sem) { might_sleep(); __down_read(sem); } EXPORT_SYMBOL(down_read_non_owner); |
4ea2176df [PATCH] lockdep: ... |
131 132 133 134 |
void down_write_nested(struct rw_semaphore *sem, int subclass) { might_sleep(); rwsem_acquire(&sem->dep_map, subclass, 0, _RET_IP_); |
4fe87745a lockstat: hook in... |
135 |
LOCK_CONTENDED(sem, __down_write_trylock, __down_write); |
4ea2176df [PATCH] lockdep: ... |
136 137 138 |
} EXPORT_SYMBOL(down_write_nested); |
84759c6d1 Revert "rw_semaph... |
139 140 141 142 143 144 |
void up_read_non_owner(struct rw_semaphore *sem) { __up_read(sem); } EXPORT_SYMBOL(up_read_non_owner); |
4ea2176df [PATCH] lockdep: ... |
145 |
#endif |