Lines Matching full:lock

44  * Lock ioctl.
52 * Add the current task to the lock wait queue, and attempt to take to lock.
57 struct drm_lock *lock = data; in drm_lock() local
63 if (lock->context == DRM_KERNEL_CONTEXT) { in drm_lock()
65 task_pid_nr(current), lock->context); in drm_lock()
69 DRM_DEBUG("%d (pid %d) requests lock (0x%08x), flags = 0x%08x\n", in drm_lock()
70 lock->context, task_pid_nr(current), in drm_lock()
71 master->lock.hw_lock->lock, lock->flags); in drm_lock()
74 if (lock->context < 0) in drm_lock()
77 add_wait_queue(&master->lock.lock_queue, &entry); in drm_lock()
78 spin_lock_bh(&master->lock.spinlock); in drm_lock()
79 master->lock.user_waiters++; in drm_lock()
80 spin_unlock_bh(&master->lock.spinlock); in drm_lock()
84 if (!master->lock.hw_lock) { in drm_lock()
90 if (drm_lock_take(&master->lock, lock->context)) { in drm_lock()
91 master->lock.file_priv = file_priv; in drm_lock()
92 master->lock.lock_time = jiffies; in drm_lock()
94 break; /* Got lock */ in drm_lock()
106 spin_lock_bh(&master->lock.spinlock); in drm_lock()
107 master->lock.user_waiters--; in drm_lock()
108 spin_unlock_bh(&master->lock.spinlock); in drm_lock()
110 remove_wait_queue(&master->lock.lock_queue, &entry); in drm_lock()
112 DRM_DEBUG("%d %s\n", lock->context, in drm_lock()
113 ret ? "interrupted" : "has lock"); in drm_lock()
125 dev->sigdata.context = lock->context; in drm_lock()
126 dev->sigdata.lock = master->lock.hw_lock; in drm_lock()
130 if (dev->driver->dma_quiescent && (lock->flags & _DRM_LOCK_QUIESCENT)) in drm_lock()
134 lock->context); in drm_lock()
151 * Transfer and free the lock.
155 struct drm_lock *lock = data; in drm_unlock() local
158 if (lock->context == DRM_KERNEL_CONTEXT) { in drm_unlock()
160 task_pid_nr(current), lock->context); in drm_unlock()
166 if (drm_lock_free(&master->lock, lock->context)) { in drm_unlock()
175 * Take the heavyweight lock.
177 * \param lock lock pointer.
179 * \return one if the lock is held, or zero otherwise.
181 * Attempt to mark the lock as held by the given context, via the \p cmpxchg instruction.
188 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_lock_take() local
192 old = *lock; in drm_lock_take()
200 prev = cmpxchg(lock, old, new); in drm_lock_take()
207 DRM_ERROR("%d holds heavyweight lock\n", in drm_lock_take()
215 /* Have lock */ in drm_lock_take()
222 * This takes a lock forcibly and hands it to context. Should ONLY be used
223 * inside *_unlock to give lock to kernel before calling *_dma_schedule.
226 * \param lock lock pointer.
230 * Resets the lock file pointer.
231 * Marks the lock as held by the given context, via the \p cmpxchg instruction.
237 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_lock_transfer() local
241 old = *lock; in drm_lock_transfer()
243 prev = cmpxchg(lock, old, new); in drm_lock_transfer()
249 * Free lock.
252 * \param lock lock.
255 * Resets the lock file pointer.
256 * Marks the lock as not held, via the \p cmpxchg instruction. Wakes any task
257 * waiting on the lock queue.
262 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_lock_free() local
274 old = *lock; in drm_lock_free()
276 prev = cmpxchg(lock, old, new); in drm_lock_free()
280 DRM_ERROR("%d freed heavyweight lock held by %d\n", in drm_lock_free()
292 * If the lock is not held, then let the signal proceed as usual. If the lock
304 /* Allow signal delivery if lock isn't held */ in drm_notifier()
305 if (!s->lock || !_DRM_LOCK_IS_HELD(s->lock->lock) in drm_notifier()
306 || _DRM_LOCKING_CONTEXT(s->lock->lock) != s->context) in drm_notifier()
312 old = s->lock->lock; in drm_notifier()
314 prev = cmpxchg(&s->lock->lock, old, new); in drm_notifier()
320 * This function returns immediately and takes the hw lock
324 * This guarantees that the kernel will _eventually_ have the lock _unless_ it is held
325 * by a blocked process. (In the latter case an explicit wait for the hardware lock would cause
354 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_idlelock_release() local
360 old = *lock; in drm_idlelock_release()
361 prev = cmpxchg(lock, old, DRM_KERNEL_CONTEXT); in drm_idlelock_release()
374 return (file_priv->lock_count && master->lock.hw_lock && in drm_i_have_hw_lock()
375 _DRM_LOCK_IS_HELD(master->lock.hw_lock->lock) && in drm_i_have_hw_lock()
376 master->lock.file_priv == file_priv); in drm_i_have_hw_lock()