Lines Matching defs:rwsem
43 #include <linux/rwsem.h>
45 #define RWSEM_WANTLOCK(RWSEM) \
46 LOCKDEBUG_WANTLOCK((RWSEM)->rws_debug, (RWSEM), \
48 #define RWSEM_LOCKED_EX(RWSEM) \
49 LOCKDEBUG_LOCKED((RWSEM)->rws_debug, (RWSEM), NULL, \
51 #define RWSEM_LOCKED_SH(RWSEM) \
52 LOCKDEBUG_LOCKED((RWSEM)->rws_debug, (RWSEM), NULL, \
54 #define RWSEM_UNLOCKED_EX(RWSEM) \
55 LOCKDEBUG_UNLOCKED((RWSEM)->rws_debug, (RWSEM), \
57 #define RWSEM_UNLOCKED_SH(RWSEM) \
58 LOCKDEBUG_UNLOCKED((RWSEM)->rws_debug, (RWSEM), \
65 const volatile struct rw_semaphore *rwsem = cookie;
67 pr("%-13s: %p", "writer", rwsem->rws_writer);
68 pr("%-13s: %u", "readers", rwsem->rws_readers);
69 pr("%-13s: %s", "writewanted", rwsem->rws_writewanted ? "yes" : "no");
80 init_rwsem(struct rw_semaphore *rwsem)
83 mutex_init(&rwsem->rws_lock, MUTEX_DEFAULT, IPL_VM);
84 cv_init(&rwsem->rws_cv, "lnxrwsem");
85 rwsem->rws_writer = NULL;
86 rwsem->rws_readers = 0;
89 rwsem->rws_debug = LOCKDEBUG_ALLOC(rwsem, &rwsem_lockops,
95 destroy_rwsem(struct rw_semaphore *rwsem)
98 KASSERT(rwsem->rws_readers == 0);
99 KASSERT(rwsem->rws_writer == NULL);
102 LOCKDEBUG_FREE(rwsem->rws_debug, rwsem);
105 cv_destroy(&rwsem->rws_cv);
106 mutex_destroy(&rwsem->rws_lock);
110 down_read(struct rw_semaphore *rwsem)
113 RWSEM_WANTLOCK(rwsem);
115 mutex_enter(&rwsem->rws_lock);
116 while (rwsem->rws_writer || rwsem->rws_writewanted)
117 cv_wait(&rwsem->rws_cv, &rwsem->rws_lock);
118 KASSERT(rwsem->rws_readers < UINT_MAX);
119 rwsem->rws_readers++;
120 mutex_exit(&rwsem->rws_lock);
122 RWSEM_LOCKED_SH(rwsem);
126 down_read_trylock(struct rw_semaphore *rwsem)
138 mutex_enter(&rwsem->rws_lock);
139 if (rwsem->rws_writer == NULL && !rwsem->rws_writewanted) {
140 KASSERT(rwsem->rws_readers < UINT_MAX);
141 rwsem->rws_readers++;
144 mutex_exit(&rwsem->rws_lock);
147 RWSEM_LOCKED_SH(rwsem);
154 up_read(struct rw_semaphore *rwsem)
157 RWSEM_UNLOCKED_SH(rwsem);
159 mutex_enter(&rwsem->rws_lock);
160 KASSERT(rwsem->rws_readers);
161 KASSERT(rwsem->rws_writer == NULL);
162 if (--rwsem->rws_readers == 0)
163 cv_broadcast(&rwsem->rws_cv);
164 mutex_exit(&rwsem->rws_lock);
168 down_write(struct rw_semaphore *rwsem)
171 RWSEM_WANTLOCK(rwsem);
173 mutex_enter(&rwsem->rws_lock);
176 while (rwsem->rws_writewanted)
177 cv_wait(&rwsem->rws_cv, &rwsem->rws_lock);
183 rwsem->rws_writewanted = true;
184 while (rwsem->rws_writer || rwsem->rws_readers) {
185 KASSERTMSG(rwsem->rws_writer != curlwp,
186 "locking against myself: rwsem=%p lwp=%p", rwsem, curlwp);
187 cv_wait(&rwsem->rws_cv, &rwsem->rws_lock);
191 KASSERT(rwsem->rws_readers == 0);
192 KASSERT(rwsem->rws_writer == NULL);
193 KASSERT(rwsem->rws_writewanted);
194 rwsem->rws_writewanted = false;
195 rwsem->rws_writer = curlwp;
197 mutex_exit(&rwsem->rws_lock);
199 RWSEM_LOCKED_EX(rwsem);
203 up_write(struct rw_semaphore *rwsem)
206 RWSEM_UNLOCKED_EX(rwsem);
208 mutex_enter(&rwsem->rws_lock);
209 KASSERT(rwsem->rws_writer == curlwp);
210 KASSERT(rwsem->rws_readers == 0);
211 rwsem->rws_writer = NULL;
212 cv_broadcast(&rwsem->rws_cv);
213 mutex_exit(&rwsem->rws_lock);
217 downgrade_write(struct rw_semaphore *rwsem)
220 RWSEM_UNLOCKED_EX(rwsem);
222 mutex_enter(&rwsem->rws_lock);
223 KASSERT(rwsem->rws_writer == curlwp);
224 KASSERT(rwsem->rws_readers == 0);
225 rwsem->rws_writer = NULL;
226 rwsem->rws_readers = 1;
227 cv_broadcast(&rwsem->rws_cv);
228 mutex_exit(&rwsem->rws_lock);
230 RWSEM_LOCKED_SH(rwsem);