Lines Matching refs:sem

23 int rwsem_is_locked(struct rw_semaphore *sem)  in rwsem_is_locked()  argument
28 if (raw_spin_trylock_irqsave(&sem->wait_lock, flags)) { in rwsem_is_locked()
29 ret = (sem->count != 0); in rwsem_is_locked()
30 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in rwsem_is_locked()
39 void __init_rwsem(struct rw_semaphore *sem, const char *name, in __init_rwsem() argument
46 debug_check_no_locks_freed((void *)sem, sizeof(*sem)); in __init_rwsem()
47 lockdep_init_map(&sem->dep_map, name, key, 0); in __init_rwsem()
49 sem->count = 0; in __init_rwsem()
50 raw_spin_lock_init(&sem->wait_lock); in __init_rwsem()
51 INIT_LIST_HEAD(&sem->wait_list); in __init_rwsem()
65 __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) in __rwsem_do_wake() argument
71 waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list); in __rwsem_do_wake()
100 if (next == &sem->wait_list) in __rwsem_do_wake()
105 sem->count += woken; in __rwsem_do_wake()
108 return sem; in __rwsem_do_wake()
115 __rwsem_wake_one_writer(struct rw_semaphore *sem) in __rwsem_wake_one_writer() argument
119 waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list); in __rwsem_wake_one_writer()
122 return sem; in __rwsem_wake_one_writer()
128 void __sched __down_read(struct rw_semaphore *sem) in __down_read() argument
134 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_read()
136 if (sem->count >= 0 && list_empty(&sem->wait_list)) { in __down_read()
138 sem->count++; in __down_read()
139 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_read()
151 list_add_tail(&waiter.list, &sem->wait_list); in __down_read()
154 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_read()
172 int __down_read_trylock(struct rw_semaphore *sem) in __down_read_trylock() argument
178 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_read_trylock()
180 if (sem->count >= 0 && list_empty(&sem->wait_list)) { in __down_read_trylock()
182 sem->count++; in __down_read_trylock()
186 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_read_trylock()
194 void __sched __down_write_nested(struct rw_semaphore *sem, int subclass) in __down_write_nested() argument
200 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_write_nested()
206 list_add_tail(&waiter.list, &sem->wait_list); in __down_write_nested()
216 if (sem->count == 0) in __down_write_nested()
219 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_write_nested()
221 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_write_nested()
224 sem->count = -1; in __down_write_nested()
227 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_write_nested()
230 void __sched __down_write(struct rw_semaphore *sem) in __down_write() argument
232 __down_write_nested(sem, 0); in __down_write()
238 int __down_write_trylock(struct rw_semaphore *sem) in __down_write_trylock() argument
243 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __down_write_trylock()
245 if (sem->count == 0) { in __down_write_trylock()
247 sem->count = -1; in __down_write_trylock()
251 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __down_write_trylock()
259 void __up_read(struct rw_semaphore *sem) in __up_read() argument
263 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __up_read()
265 if (--sem->count == 0 && !list_empty(&sem->wait_list)) in __up_read()
266 sem = __rwsem_wake_one_writer(sem); in __up_read()
268 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __up_read()
274 void __up_write(struct rw_semaphore *sem) in __up_write() argument
278 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __up_write()
280 sem->count = 0; in __up_write()
281 if (!list_empty(&sem->wait_list)) in __up_write()
282 sem = __rwsem_do_wake(sem, 1); in __up_write()
284 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __up_write()
291 void __downgrade_write(struct rw_semaphore *sem) in __downgrade_write() argument
295 raw_spin_lock_irqsave(&sem->wait_lock, flags); in __downgrade_write()
297 sem->count = 1; in __downgrade_write()
298 if (!list_empty(&sem->wait_list)) in __downgrade_write()
299 sem = __rwsem_do_wake(sem, 0); in __downgrade_write()
301 raw_spin_unlock_irqrestore(&sem->wait_lock, flags); in __downgrade_write()