Lines Matching refs:lock
50 void ttm_lock_init(struct ttm_lock *lock)
52 spin_lock_init(&lock->lock);
53 DRM_INIT_WAITQUEUE(&lock->queue, "ttmlock");
54 lock->rw = 0;
55 lock->flags = 0;
58 void ttm_read_unlock(struct ttm_lock *lock)
60 spin_lock(&lock->lock);
61 if (--lock->rw == 0)
62 DRM_SPIN_WAKEUP_ALL(&lock->queue, &lock->lock);
63 spin_unlock(&lock->lock);
66 static bool __ttm_read_lock(struct ttm_lock *lock)
70 if (lock->rw >= 0 && lock->flags == 0) {
71 ++lock->rw;
77 int ttm_read_lock(struct ttm_lock *lock, bool interruptible)
81 spin_lock(&lock->lock);
83 DRM_SPIN_WAIT_UNTIL(ret, &lock->queue, &lock->lock,
84 __ttm_read_lock(lock));
86 DRM_SPIN_WAIT_NOINTR_UNTIL(ret, &lock->queue, &lock->lock,
87 __ttm_read_lock(lock));
88 spin_unlock(&lock->lock);
93 static bool __ttm_read_trylock(struct ttm_lock *lock, bool *locked)
99 spin_lock(&lock->lock);
100 if (lock->rw >= 0 && lock->flags == 0) {
101 ++lock->rw;
104 } else if (lock->flags == 0) {
107 spin_unlock(&lock->lock);
112 int ttm_read_trylock(struct ttm_lock *lock, bool interruptible)
117 spin_lock(&lock->lock);
119 DRM_SPIN_WAIT_UNTIL(ret, &lock->queue, &lock->lock,
120 __ttm_read_trylock(lock, &locked));
122 DRM_SPIN_WAIT_NOINTR_UNTIL(ret, &lock->queue, &lock->lock,
123 __ttm_read_trylock(lock, &locked));
124 spin_unlock(&lock->lock);
134 void ttm_write_unlock(struct ttm_lock *lock)
136 spin_lock(&lock->lock);
137 lock->rw = 0;
138 DRM_SPIN_WAKEUP_ALL(&lock->queue, &lock->lock);
139 spin_unlock(&lock->lock);
142 static bool __ttm_write_lock(struct ttm_lock *lock)
146 spin_lock(&lock->lock);
147 if (lock->rw == 0 && ((lock->flags & ~TTM_WRITE_LOCK_PENDING) == 0)) {
148 lock->rw = -1;
149 lock->flags &= ~TTM_WRITE_LOCK_PENDING;
152 lock->flags |= TTM_WRITE_LOCK_PENDING;
154 spin_unlock(&lock->lock);
158 int ttm_write_lock(struct ttm_lock *lock, bool interruptible)
162 spin_lock(&lock->lock);
164 DRM_SPIN_WAIT_UNTIL(ret, &lock->queue, &lock->lock,
165 __ttm_write_lock(lock));
167 lock->flags &= ~TTM_WRITE_LOCK_PENDING;
168 DRM_SPIN_WAKEUP_ONE(&lock->queue, &lock->lock);
171 DRM_SPIN_WAIT_NOINTR_UNTIL(ret, &lock->queue, &lock->lock,
172 __ttm_write_lock(lock));
173 spin_unlock(&lock->lock);
178 void ttm_suspend_unlock(struct ttm_lock *lock)
180 spin_lock(&lock->lock);
181 lock->flags &= ~TTM_SUSPEND_LOCK;
182 DRM_SPIN_WAKEUP_ALL(&lock->queue, &lock->lock);
183 spin_unlock(&lock->lock);
186 static bool __ttm_suspend_lock(struct ttm_lock *lock)
190 if (lock->rw == 0) {
191 lock->flags &= ~TTM_SUSPEND_LOCK_PENDING;
192 lock->flags |= TTM_SUSPEND_LOCK;
195 lock->flags |= TTM_SUSPEND_LOCK_PENDING;
200 void ttm_suspend_lock(struct ttm_lock *lock)
204 spin_lock(&lock->lock);
205 DRM_SPIN_WAIT_UNTIL(ret, &lock->queue, &lock->lock,
206 __ttm_suspend_lock(lock));
207 spin_unlock(&lock->lock);