Lines Matching full:lock
46 * Take the heavyweight lock.
48 * \param lock lock pointer.
50 * \return one if the lock is held, or zero otherwise.
52 * Attempt to mark the lock as held by the given context, via the \p cmpxchg instruction.
59 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_lock_take() local
63 old = *lock; in drm_lock_take()
71 prev = cmpxchg(lock, old, new); in drm_lock_take()
78 DRM_ERROR("%d holds heavyweight lock\n", in drm_lock_take()
86 /* Have lock */ in drm_lock_take()
93 * This takes a lock forcibly and hands it to context. Should ONLY be used
94 * inside *_unlock to give lock to kernel before calling *_dma_schedule.
97 * \param lock lock pointer.
101 * Resets the lock file pointer.
102 * Marks the lock as held by the given context, via the \p cmpxchg instruction.
108 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_lock_transfer() local
112 old = *lock; in drm_lock_transfer()
114 prev = cmpxchg(lock, old, new); in drm_lock_transfer()
123 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_legacy_lock_free() local
135 old = *lock; in drm_legacy_lock_free()
137 prev = cmpxchg(lock, old, new); in drm_legacy_lock_free()
141 DRM_ERROR("%d freed heavyweight lock held by %d\n", in drm_legacy_lock_free()
150 * Lock ioctl.
158 * Add the current task to the lock wait queue, and attempt to take to lock.
164 struct drm_lock *lock = data; in drm_legacy_lock() local
173 if (lock->context == DRM_KERNEL_CONTEXT) { in drm_legacy_lock()
175 task_pid_nr(current), lock->context); in drm_legacy_lock()
179 DRM_DEBUG("%d (pid %d) requests lock (0x%08x), flags = 0x%08x\n", in drm_legacy_lock()
180 lock->context, task_pid_nr(current), in drm_legacy_lock()
181 master->lock.hw_lock ? master->lock.hw_lock->lock : -1, in drm_legacy_lock()
182 lock->flags); in drm_legacy_lock()
184 add_wait_queue(&master->lock.lock_queue, &entry); in drm_legacy_lock()
185 spin_lock_bh(&master->lock.spinlock); in drm_legacy_lock()
186 master->lock.user_waiters++; in drm_legacy_lock()
187 spin_unlock_bh(&master->lock.spinlock); in drm_legacy_lock()
191 if (!master->lock.hw_lock) { in drm_legacy_lock()
197 if (drm_lock_take(&master->lock, lock->context)) { in drm_legacy_lock()
198 master->lock.file_priv = file_priv; in drm_legacy_lock()
199 master->lock.lock_time = jiffies; in drm_legacy_lock()
200 break; /* Got lock */ in drm_legacy_lock()
212 spin_lock_bh(&master->lock.spinlock); in drm_legacy_lock()
213 master->lock.user_waiters--; in drm_legacy_lock()
214 spin_unlock_bh(&master->lock.spinlock); in drm_legacy_lock()
216 remove_wait_queue(&master->lock.lock_queue, &entry); in drm_legacy_lock()
218 DRM_DEBUG("%d %s\n", lock->context, in drm_legacy_lock()
219 ret ? "interrupted" : "has lock"); in drm_legacy_lock()
226 dev->sigdata.context = lock->context; in drm_legacy_lock()
227 dev->sigdata.lock = master->lock.hw_lock; in drm_legacy_lock()
230 if (dev->driver->dma_quiescent && (lock->flags & _DRM_LOCK_QUIESCENT)) in drm_legacy_lock()
234 lock->context); in drm_legacy_lock()
251 * Transfer and free the lock.
255 struct drm_lock *lock = data; in drm_legacy_unlock() local
261 if (lock->context == DRM_KERNEL_CONTEXT) { in drm_legacy_unlock()
263 task_pid_nr(current), lock->context); in drm_legacy_unlock()
267 if (drm_legacy_lock_free(&master->lock, lock->context)) { in drm_legacy_unlock()
275 * This function returns immediately and takes the hw lock
279 * This guarantees that the kernel will _eventually_ have the lock _unless_ it is held
280 * by a blocked process. (In the latter case an explicit wait for the hardware lock would cause
309 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_legacy_idlelock_release() local
315 old = *lock; in drm_legacy_idlelock_release()
316 prev = cmpxchg(lock, old, DRM_KERNEL_CONTEXT); in drm_legacy_idlelock_release()
330 return (file_priv->lock_count && master->lock.hw_lock && in drm_legacy_i_have_hw_lock()
331 _DRM_LOCK_IS_HELD(master->lock.hw_lock->lock) && in drm_legacy_i_have_hw_lock()
332 master->lock.file_priv == file_priv); in drm_legacy_i_have_hw_lock()
339 /* if the master has gone away we can't do anything with the lock */ in drm_legacy_lock_release()
344 DRM_DEBUG("File %p released, freeing lock for context %d\n", in drm_legacy_lock_release()
345 filp, _DRM_LOCKING_CONTEXT(file_priv->master->lock.hw_lock->lock)); in drm_legacy_lock_release()
346 drm_legacy_lock_free(&file_priv->master->lock, in drm_legacy_lock_release()
347 _DRM_LOCKING_CONTEXT(file_priv->master->lock.hw_lock->lock)); in drm_legacy_lock_release()