• Home
  • Raw
  • Download

Lines Matching full:lock

46 void ttm_lock_init(struct ttm_lock *lock)  in ttm_lock_init()  argument
48 spin_lock_init(&lock->lock); in ttm_lock_init()
49 init_waitqueue_head(&lock->queue); in ttm_lock_init()
50 lock->rw = 0; in ttm_lock_init()
51 lock->flags = 0; in ttm_lock_init()
52 lock->kill_takers = false; in ttm_lock_init()
53 lock->signal = SIGKILL; in ttm_lock_init()
57 void ttm_read_unlock(struct ttm_lock *lock) in ttm_read_unlock() argument
59 spin_lock(&lock->lock); in ttm_read_unlock()
60 if (--lock->rw == 0) in ttm_read_unlock()
61 wake_up_all(&lock->queue); in ttm_read_unlock()
62 spin_unlock(&lock->lock); in ttm_read_unlock()
66 static bool __ttm_read_lock(struct ttm_lock *lock) in __ttm_read_lock() argument
70 spin_lock(&lock->lock); in __ttm_read_lock()
71 if (unlikely(lock->kill_takers)) { in __ttm_read_lock()
72 send_sig(lock->signal, current, 0); in __ttm_read_lock()
73 spin_unlock(&lock->lock); in __ttm_read_lock()
76 if (lock->rw >= 0 && lock->flags == 0) { in __ttm_read_lock()
77 ++lock->rw; in __ttm_read_lock()
80 spin_unlock(&lock->lock); in __ttm_read_lock()
84 int ttm_read_lock(struct ttm_lock *lock, bool interruptible) in ttm_read_lock() argument
89 ret = wait_event_interruptible(lock->queue, in ttm_read_lock()
90 __ttm_read_lock(lock)); in ttm_read_lock()
92 wait_event(lock->queue, __ttm_read_lock(lock)); in ttm_read_lock()
97 static bool __ttm_read_trylock(struct ttm_lock *lock, bool *locked) in __ttm_read_trylock() argument
103 spin_lock(&lock->lock); in __ttm_read_trylock()
104 if (unlikely(lock->kill_takers)) { in __ttm_read_trylock()
105 send_sig(lock->signal, current, 0); in __ttm_read_trylock()
106 spin_unlock(&lock->lock); in __ttm_read_trylock()
109 if (lock->rw >= 0 && lock->flags == 0) { in __ttm_read_trylock()
110 ++lock->rw; in __ttm_read_trylock()
113 } else if (lock->flags == 0) { in __ttm_read_trylock()
116 spin_unlock(&lock->lock); in __ttm_read_trylock()
121 int ttm_read_trylock(struct ttm_lock *lock, bool interruptible) in ttm_read_trylock() argument
128 (lock->queue, __ttm_read_trylock(lock, &locked)); in ttm_read_trylock()
130 wait_event(lock->queue, __ttm_read_trylock(lock, &locked)); in ttm_read_trylock()
140 void ttm_write_unlock(struct ttm_lock *lock) in ttm_write_unlock() argument
142 spin_lock(&lock->lock); in ttm_write_unlock()
143 lock->rw = 0; in ttm_write_unlock()
144 wake_up_all(&lock->queue); in ttm_write_unlock()
145 spin_unlock(&lock->lock); in ttm_write_unlock()
149 static bool __ttm_write_lock(struct ttm_lock *lock) in __ttm_write_lock() argument
153 spin_lock(&lock->lock); in __ttm_write_lock()
154 if (unlikely(lock->kill_takers)) { in __ttm_write_lock()
155 send_sig(lock->signal, current, 0); in __ttm_write_lock()
156 spin_unlock(&lock->lock); in __ttm_write_lock()
159 if (lock->rw == 0 && ((lock->flags & ~TTM_WRITE_LOCK_PENDING) == 0)) { in __ttm_write_lock()
160 lock->rw = -1; in __ttm_write_lock()
161 lock->flags &= ~TTM_WRITE_LOCK_PENDING; in __ttm_write_lock()
164 lock->flags |= TTM_WRITE_LOCK_PENDING; in __ttm_write_lock()
166 spin_unlock(&lock->lock); in __ttm_write_lock()
170 int ttm_write_lock(struct ttm_lock *lock, bool interruptible) in ttm_write_lock() argument
175 ret = wait_event_interruptible(lock->queue, in ttm_write_lock()
176 __ttm_write_lock(lock)); in ttm_write_lock()
178 spin_lock(&lock->lock); in ttm_write_lock()
179 lock->flags &= ~TTM_WRITE_LOCK_PENDING; in ttm_write_lock()
180 wake_up_all(&lock->queue); in ttm_write_lock()
181 spin_unlock(&lock->lock); in ttm_write_lock()
184 wait_event(lock->queue, __ttm_write_lock(lock)); in ttm_write_lock()
190 static int __ttm_vt_unlock(struct ttm_lock *lock) in __ttm_vt_unlock() argument
194 spin_lock(&lock->lock); in __ttm_vt_unlock()
195 if (unlikely(!(lock->flags & TTM_VT_LOCK))) in __ttm_vt_unlock()
197 lock->flags &= ~TTM_VT_LOCK; in __ttm_vt_unlock()
198 wake_up_all(&lock->queue); in __ttm_vt_unlock()
199 spin_unlock(&lock->lock); in __ttm_vt_unlock()
207 struct ttm_lock *lock = container_of(base, struct ttm_lock, base); in ttm_vt_lock_remove() local
211 ret = __ttm_vt_unlock(lock); in ttm_vt_lock_remove()
215 static bool __ttm_vt_lock(struct ttm_lock *lock) in __ttm_vt_lock() argument
219 spin_lock(&lock->lock); in __ttm_vt_lock()
220 if (lock->rw == 0) { in __ttm_vt_lock()
221 lock->flags &= ~TTM_VT_LOCK_PENDING; in __ttm_vt_lock()
222 lock->flags |= TTM_VT_LOCK; in __ttm_vt_lock()
225 lock->flags |= TTM_VT_LOCK_PENDING; in __ttm_vt_lock()
227 spin_unlock(&lock->lock); in __ttm_vt_lock()
231 int ttm_vt_lock(struct ttm_lock *lock, in ttm_vt_lock() argument
238 ret = wait_event_interruptible(lock->queue, in ttm_vt_lock()
239 __ttm_vt_lock(lock)); in ttm_vt_lock()
241 spin_lock(&lock->lock); in ttm_vt_lock()
242 lock->flags &= ~TTM_VT_LOCK_PENDING; in ttm_vt_lock()
243 wake_up_all(&lock->queue); in ttm_vt_lock()
244 spin_unlock(&lock->lock); in ttm_vt_lock()
248 wait_event(lock->queue, __ttm_vt_lock(lock)); in ttm_vt_lock()
252 * make sure the lock is released if the client dies in ttm_vt_lock()
256 ret = ttm_base_object_init(tfile, &lock->base, false, in ttm_vt_lock()
259 (void)__ttm_vt_unlock(lock); in ttm_vt_lock()
261 lock->vt_holder = tfile; in ttm_vt_lock()
267 int ttm_vt_unlock(struct ttm_lock *lock) in ttm_vt_unlock() argument
269 return ttm_ref_object_base_unref(lock->vt_holder, in ttm_vt_unlock()
270 lock->base.hash.key, TTM_REF_USAGE); in ttm_vt_unlock()
274 void ttm_suspend_unlock(struct ttm_lock *lock) in ttm_suspend_unlock() argument
276 spin_lock(&lock->lock); in ttm_suspend_unlock()
277 lock->flags &= ~TTM_SUSPEND_LOCK; in ttm_suspend_unlock()
278 wake_up_all(&lock->queue); in ttm_suspend_unlock()
279 spin_unlock(&lock->lock); in ttm_suspend_unlock()
283 static bool __ttm_suspend_lock(struct ttm_lock *lock) in __ttm_suspend_lock() argument
287 spin_lock(&lock->lock); in __ttm_suspend_lock()
288 if (lock->rw == 0) { in __ttm_suspend_lock()
289 lock->flags &= ~TTM_SUSPEND_LOCK_PENDING; in __ttm_suspend_lock()
290 lock->flags |= TTM_SUSPEND_LOCK; in __ttm_suspend_lock()
293 lock->flags |= TTM_SUSPEND_LOCK_PENDING; in __ttm_suspend_lock()
295 spin_unlock(&lock->lock); in __ttm_suspend_lock()
299 void ttm_suspend_lock(struct ttm_lock *lock) in ttm_suspend_lock() argument
301 wait_event(lock->queue, __ttm_suspend_lock(lock)); in ttm_suspend_lock()