Lines Matching full:lock
45 void ttm_lock_init(struct ttm_lock *lock) in ttm_lock_init() argument
47 spin_lock_init(&lock->lock); in ttm_lock_init()
48 init_waitqueue_head(&lock->queue); in ttm_lock_init()
49 lock->rw = 0; in ttm_lock_init()
50 lock->flags = 0; in ttm_lock_init()
51 lock->kill_takers = false; in ttm_lock_init()
52 lock->signal = SIGKILL; in ttm_lock_init()
56 void ttm_read_unlock(struct ttm_lock *lock) in ttm_read_unlock() argument
58 spin_lock(&lock->lock); in ttm_read_unlock()
59 if (--lock->rw == 0) in ttm_read_unlock()
60 wake_up_all(&lock->queue); in ttm_read_unlock()
61 spin_unlock(&lock->lock); in ttm_read_unlock()
65 static bool __ttm_read_lock(struct ttm_lock *lock) in __ttm_read_lock() argument
69 spin_lock(&lock->lock); in __ttm_read_lock()
70 if (unlikely(lock->kill_takers)) { in __ttm_read_lock()
71 send_sig(lock->signal, current, 0); in __ttm_read_lock()
72 spin_unlock(&lock->lock); in __ttm_read_lock()
75 if (lock->rw >= 0 && lock->flags == 0) { in __ttm_read_lock()
76 ++lock->rw; in __ttm_read_lock()
79 spin_unlock(&lock->lock); in __ttm_read_lock()
83 int ttm_read_lock(struct ttm_lock *lock, bool interruptible) in ttm_read_lock() argument
88 ret = wait_event_interruptible(lock->queue, in ttm_read_lock()
89 __ttm_read_lock(lock)); in ttm_read_lock()
91 wait_event(lock->queue, __ttm_read_lock(lock)); in ttm_read_lock()
96 static bool __ttm_read_trylock(struct ttm_lock *lock, bool *locked) in __ttm_read_trylock() argument
102 spin_lock(&lock->lock); in __ttm_read_trylock()
103 if (unlikely(lock->kill_takers)) { in __ttm_read_trylock()
104 send_sig(lock->signal, current, 0); in __ttm_read_trylock()
105 spin_unlock(&lock->lock); in __ttm_read_trylock()
108 if (lock->rw >= 0 && lock->flags == 0) { in __ttm_read_trylock()
109 ++lock->rw; in __ttm_read_trylock()
112 } else if (lock->flags == 0) { in __ttm_read_trylock()
115 spin_unlock(&lock->lock); in __ttm_read_trylock()
120 int ttm_read_trylock(struct ttm_lock *lock, bool interruptible) in ttm_read_trylock() argument
127 (lock->queue, __ttm_read_trylock(lock, &locked)); in ttm_read_trylock()
129 wait_event(lock->queue, __ttm_read_trylock(lock, &locked)); in ttm_read_trylock()
139 void ttm_write_unlock(struct ttm_lock *lock) in ttm_write_unlock() argument
141 spin_lock(&lock->lock); in ttm_write_unlock()
142 lock->rw = 0; in ttm_write_unlock()
143 wake_up_all(&lock->queue); in ttm_write_unlock()
144 spin_unlock(&lock->lock); in ttm_write_unlock()
148 static bool __ttm_write_lock(struct ttm_lock *lock) in __ttm_write_lock() argument
152 spin_lock(&lock->lock); in __ttm_write_lock()
153 if (unlikely(lock->kill_takers)) { in __ttm_write_lock()
154 send_sig(lock->signal, current, 0); in __ttm_write_lock()
155 spin_unlock(&lock->lock); in __ttm_write_lock()
158 if (lock->rw == 0 && ((lock->flags & ~TTM_WRITE_LOCK_PENDING) == 0)) { in __ttm_write_lock()
159 lock->rw = -1; in __ttm_write_lock()
160 lock->flags &= ~TTM_WRITE_LOCK_PENDING; in __ttm_write_lock()
163 lock->flags |= TTM_WRITE_LOCK_PENDING; in __ttm_write_lock()
165 spin_unlock(&lock->lock); in __ttm_write_lock()
169 int ttm_write_lock(struct ttm_lock *lock, bool interruptible) in ttm_write_lock() argument
174 ret = wait_event_interruptible(lock->queue, in ttm_write_lock()
175 __ttm_write_lock(lock)); in ttm_write_lock()
177 spin_lock(&lock->lock); in ttm_write_lock()
178 lock->flags &= ~TTM_WRITE_LOCK_PENDING; in ttm_write_lock()
179 wake_up_all(&lock->queue); in ttm_write_lock()
180 spin_unlock(&lock->lock); in ttm_write_lock()
183 wait_event(lock->queue, __ttm_read_lock(lock)); in ttm_write_lock()
189 void ttm_write_lock_downgrade(struct ttm_lock *lock) in ttm_write_lock_downgrade() argument
191 spin_lock(&lock->lock); in ttm_write_lock_downgrade()
192 lock->rw = 1; in ttm_write_lock_downgrade()
193 wake_up_all(&lock->queue); in ttm_write_lock_downgrade()
194 spin_unlock(&lock->lock); in ttm_write_lock_downgrade()
197 static int __ttm_vt_unlock(struct ttm_lock *lock) in __ttm_vt_unlock() argument
201 spin_lock(&lock->lock); in __ttm_vt_unlock()
202 if (unlikely(!(lock->flags & TTM_VT_LOCK))) in __ttm_vt_unlock()
204 lock->flags &= ~TTM_VT_LOCK; in __ttm_vt_unlock()
205 wake_up_all(&lock->queue); in __ttm_vt_unlock()
206 spin_unlock(&lock->lock); in __ttm_vt_unlock()
214 struct ttm_lock *lock = container_of(base, struct ttm_lock, base); in ttm_vt_lock_remove() local
218 ret = __ttm_vt_unlock(lock); in ttm_vt_lock_remove()
222 static bool __ttm_vt_lock(struct ttm_lock *lock) in __ttm_vt_lock() argument
226 spin_lock(&lock->lock); in __ttm_vt_lock()
227 if (lock->rw == 0) { in __ttm_vt_lock()
228 lock->flags &= ~TTM_VT_LOCK_PENDING; in __ttm_vt_lock()
229 lock->flags |= TTM_VT_LOCK; in __ttm_vt_lock()
232 lock->flags |= TTM_VT_LOCK_PENDING; in __ttm_vt_lock()
234 spin_unlock(&lock->lock); in __ttm_vt_lock()
238 int ttm_vt_lock(struct ttm_lock *lock, in ttm_vt_lock() argument
245 ret = wait_event_interruptible(lock->queue, in ttm_vt_lock()
246 __ttm_vt_lock(lock)); in ttm_vt_lock()
248 spin_lock(&lock->lock); in ttm_vt_lock()
249 lock->flags &= ~TTM_VT_LOCK_PENDING; in ttm_vt_lock()
250 wake_up_all(&lock->queue); in ttm_vt_lock()
251 spin_unlock(&lock->lock); in ttm_vt_lock()
255 wait_event(lock->queue, __ttm_vt_lock(lock)); in ttm_vt_lock()
259 * make sure the lock is released if the client dies in ttm_vt_lock()
263 ret = ttm_base_object_init(tfile, &lock->base, false, in ttm_vt_lock()
266 (void)__ttm_vt_unlock(lock); in ttm_vt_lock()
268 lock->vt_holder = tfile; in ttm_vt_lock()
274 int ttm_vt_unlock(struct ttm_lock *lock) in ttm_vt_unlock() argument
276 return ttm_ref_object_base_unref(lock->vt_holder, in ttm_vt_unlock()
277 lock->base.hash.key, TTM_REF_USAGE); in ttm_vt_unlock()
281 void ttm_suspend_unlock(struct ttm_lock *lock) in ttm_suspend_unlock() argument
283 spin_lock(&lock->lock); in ttm_suspend_unlock()
284 lock->flags &= ~TTM_SUSPEND_LOCK; in ttm_suspend_unlock()
285 wake_up_all(&lock->queue); in ttm_suspend_unlock()
286 spin_unlock(&lock->lock); in ttm_suspend_unlock()
290 static bool __ttm_suspend_lock(struct ttm_lock *lock) in __ttm_suspend_lock() argument
294 spin_lock(&lock->lock); in __ttm_suspend_lock()
295 if (lock->rw == 0) { in __ttm_suspend_lock()
296 lock->flags &= ~TTM_SUSPEND_LOCK_PENDING; in __ttm_suspend_lock()
297 lock->flags |= TTM_SUSPEND_LOCK; in __ttm_suspend_lock()
300 lock->flags |= TTM_SUSPEND_LOCK_PENDING; in __ttm_suspend_lock()
302 spin_unlock(&lock->lock); in __ttm_suspend_lock()
306 void ttm_suspend_lock(struct ttm_lock *lock) in ttm_suspend_lock() argument
308 wait_event(lock->queue, __ttm_suspend_lock(lock)); in ttm_suspend_lock()