Lines Matching refs:sem
25 int rwsem_is_locked(struct rw_semaphore *sem) in rwsem_is_locked() argument
30 if (raw_spin_trylock_irqsave(&sem->wait_lock, flags)) { in rwsem_is_locked()
31 ret = (sem->count != 0); in rwsem_is_locked()
32 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in rwsem_is_locked()
41 void __init_rwsem(struct rw_semaphore *sem, const char *name, in __init_rwsem() argument
48 debug_check_no_locks_freed((void *)sem, sizeof(*sem)); in __init_rwsem()
49 lockdep_init_map(&sem->dep_map, name, key, 0); in __init_rwsem()
51 sem->count = 0; in __init_rwsem()
52 raw_spin_lock_init(&sem->wait_lock); in __init_rwsem()
53 INIT_LIST_HEAD(&sem->wait_list); in __init_rwsem()
67 __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) in __rwsem_do_wake() argument
73 waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list); in __rwsem_do_wake()
102 if (next == &sem->wait_list) in __rwsem_do_wake()
107 sem->count += woken; in __rwsem_do_wake()
110 return sem; in __rwsem_do_wake()
117 __rwsem_wake_one_writer(struct rw_semaphore *sem) in __rwsem_wake_one_writer() argument
121 waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list); in __rwsem_wake_one_writer()
124 return sem; in __rwsem_wake_one_writer()
130 int __sched __down_read_common(struct rw_semaphore *sem, int state) in __down_read_common() argument
135 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_read_common()
137 if (sem->count >= 0 && list_empty(&sem->wait_list)) { in __down_read_common()
139 sem->count++; in __down_read_common()
140 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_read_common()
149 list_add_tail(&waiter.list, &sem->wait_list); in __down_read_common()
158 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_read_common()
160 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_read_common()
163 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_read_common()
174 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_read_common()
178 void __sched __down_read(struct rw_semaphore *sem) in __down_read() argument
180 __down_read_common(sem, TASK_UNINTERRUPTIBLE); in __down_read()
183 int __sched __down_read_killable(struct rw_semaphore *sem) in __down_read_killable() argument
185 return __down_read_common(sem, TASK_KILLABLE); in __down_read_killable()
191 int __down_read_trylock(struct rw_semaphore *sem) in __down_read_trylock() argument
197 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_read_trylock()
199 if (sem->count >= 0 && list_empty(&sem->wait_list)) { in __down_read_trylock()
201 sem->count++; in __down_read_trylock()
205 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_read_trylock()
213 int __sched __down_write_common(struct rw_semaphore *sem, int state) in __down_write_common() argument
219 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_write_common()
224 list_add_tail(&waiter.list, &sem->wait_list); in __down_write_common()
234 if (sem->count == 0) in __down_write_common()
240 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_write_common()
242 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_write_common()
245 sem->count = -1; in __down_write_common()
248 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_write_common()
254 if (!list_empty(&sem->wait_list) && sem->count >= 0) in __down_write_common()
255 __rwsem_do_wake(sem, 0); in __down_write_common()
256 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_write_common()
261 void __sched __down_write(struct rw_semaphore *sem) in __down_write() argument
263 __down_write_common(sem, TASK_UNINTERRUPTIBLE); in __down_write()
266 int __sched __down_write_killable(struct rw_semaphore *sem) in __down_write_killable() argument
268 return __down_write_common(sem, TASK_KILLABLE); in __down_write_killable()
274 int __down_write_trylock(struct rw_semaphore *sem) in __down_write_trylock() argument
279 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_write_trylock()
281 if (sem->count == 0) { in __down_write_trylock()
283 sem->count = -1; in __down_write_trylock()
287 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_write_trylock()
295 void __up_read(struct rw_semaphore *sem) in __up_read() argument
299 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __up_read()
301 if (--sem->count == 0 && !list_empty(&sem->wait_list)) in __up_read()
302 sem = __rwsem_wake_one_writer(sem); in __up_read()
304 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __up_read()
310 void __up_write(struct rw_semaphore *sem) in __up_write() argument
314 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __up_write()
316 sem->count = 0; in __up_write()
317 if (!list_empty(&sem->wait_list)) in __up_write()
318 sem = __rwsem_do_wake(sem, 1); in __up_write()
320 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __up_write()
327 void __downgrade_write(struct rw_semaphore *sem) in __downgrade_write() argument
331 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __downgrade_write()
333 sem->count = 1; in __downgrade_write()
334 if (!list_empty(&sem->wait_list)) in __downgrade_write()
335 sem = __rwsem_do_wake(sem, 0); in __downgrade_write()
337 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __downgrade_write()