Lines Matching refs: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 static int __ttm_vt_unlock(struct ttm_lock *lock) in __ttm_vt_unlock() argument
193 spin_lock(&lock->lock); in __ttm_vt_unlock()
194 if (unlikely(!(lock->flags & TTM_VT_LOCK))) in __ttm_vt_unlock()
196 lock->flags &= ~TTM_VT_LOCK; in __ttm_vt_unlock()
197 wake_up_all(&lock->queue); in __ttm_vt_unlock()
198 spin_unlock(&lock->lock); in __ttm_vt_unlock()
206 struct ttm_lock *lock = container_of(base, struct ttm_lock, base); in ttm_vt_lock_remove() local
210 ret = __ttm_vt_unlock(lock); in ttm_vt_lock_remove()
214 static bool __ttm_vt_lock(struct ttm_lock *lock) in __ttm_vt_lock() argument
218 spin_lock(&lock->lock); in __ttm_vt_lock()
219 if (lock->rw == 0) { in __ttm_vt_lock()
220 lock->flags &= ~TTM_VT_LOCK_PENDING; in __ttm_vt_lock()
221 lock->flags |= TTM_VT_LOCK; in __ttm_vt_lock()
224 lock->flags |= TTM_VT_LOCK_PENDING; in __ttm_vt_lock()
226 spin_unlock(&lock->lock); in __ttm_vt_lock()
230 int ttm_vt_lock(struct ttm_lock *lock, in ttm_vt_lock() argument
237 ret = wait_event_interruptible(lock->queue, in ttm_vt_lock()
238 __ttm_vt_lock(lock)); in ttm_vt_lock()
240 spin_lock(&lock->lock); in ttm_vt_lock()
241 lock->flags &= ~TTM_VT_LOCK_PENDING; in ttm_vt_lock()
242 wake_up_all(&lock->queue); in ttm_vt_lock()
243 spin_unlock(&lock->lock); in ttm_vt_lock()
247 wait_event(lock->queue, __ttm_vt_lock(lock)); in ttm_vt_lock()
255 ret = ttm_base_object_init(tfile, &lock->base, false, in ttm_vt_lock()
258 (void)__ttm_vt_unlock(lock); in ttm_vt_lock()
260 lock->vt_holder = tfile; in ttm_vt_lock()
266 int ttm_vt_unlock(struct ttm_lock *lock) in ttm_vt_unlock() argument
268 return ttm_ref_object_base_unref(lock->vt_holder, in ttm_vt_unlock()
269 lock->base.hash.key, TTM_REF_USAGE); in ttm_vt_unlock()
273 void ttm_suspend_unlock(struct ttm_lock *lock) in ttm_suspend_unlock() argument
275 spin_lock(&lock->lock); in ttm_suspend_unlock()
276 lock->flags &= ~TTM_SUSPEND_LOCK; in ttm_suspend_unlock()
277 wake_up_all(&lock->queue); in ttm_suspend_unlock()
278 spin_unlock(&lock->lock); in ttm_suspend_unlock()
282 static bool __ttm_suspend_lock(struct ttm_lock *lock) in __ttm_suspend_lock() argument
286 spin_lock(&lock->lock); in __ttm_suspend_lock()
287 if (lock->rw == 0) { in __ttm_suspend_lock()
288 lock->flags &= ~TTM_SUSPEND_LOCK_PENDING; in __ttm_suspend_lock()
289 lock->flags |= TTM_SUSPEND_LOCK; in __ttm_suspend_lock()
292 lock->flags |= TTM_SUSPEND_LOCK_PENDING; in __ttm_suspend_lock()
294 spin_unlock(&lock->lock); in __ttm_suspend_lock()
298 void ttm_suspend_lock(struct ttm_lock *lock) in ttm_suspend_lock() argument
300 wait_event(lock->queue, __ttm_suspend_lock(lock)); in ttm_suspend_lock()