Blame view
kernel/rwsem.c
2.59 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> |
c4e05116a [PATCH] lockdep: ... |
10 11 12 13 14 15 16 17 18 |
#include <linux/module.h> #include <linux/rwsem.h> #include <asm/system.h> #include <asm/atomic.h> /* * lock for reading */ |
c7af77b58 sched: mark rwsem... |
19 |
void __sched down_read(struct rw_semaphore *sem) |
c4e05116a [PATCH] lockdep: ... |
20 21 22 |
{ might_sleep(); rwsem_acquire_read(&sem->dep_map, 0, 0, _RET_IP_); |
4fe87745a lockstat: hook in... |
23 |
LOCK_CONTENDED(sem, __down_read_trylock, __down_read); |
c4e05116a [PATCH] lockdep: ... |
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
} 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... |
45 |
void __sched down_write(struct rw_semaphore *sem) |
c4e05116a [PATCH] lockdep: ... |
46 47 48 |
{ might_sleep(); rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_); |
4fe87745a lockstat: hook in... |
49 |
LOCK_CONTENDED(sem, __down_write_trylock, __down_write); |
c4e05116a [PATCH] lockdep: ... |
50 51 52 53 54 55 56 57 58 59 60 61 |
} 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... |
62 |
rwsem_acquire(&sem->dep_map, 0, 1, _RET_IP_); |
c4e05116a [PATCH] lockdep: ... |
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 103 104 |
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: ... |
105 106 107 108 109 110 111 |
#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... |
112 |
LOCK_CONTENDED(sem, __down_read_trylock, __down_read); |
4ea2176df [PATCH] lockdep: ... |
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
} EXPORT_SYMBOL(down_read_nested); void down_read_non_owner(struct rw_semaphore *sem) { might_sleep(); __down_read(sem); } EXPORT_SYMBOL(down_read_non_owner); 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... |
130 |
LOCK_CONTENDED(sem, __down_write_trylock, __down_write); |
4ea2176df [PATCH] lockdep: ... |
131 132 133 134 135 136 137 138 139 140 141 142 |
} EXPORT_SYMBOL(down_write_nested); void up_read_non_owner(struct rw_semaphore *sem) { __up_read(sem); } EXPORT_SYMBOL(up_read_non_owner); #endif |