Lines Matching +full:master +full:- +full:kernel

59 	struct drm_master *master = file_priv->master;  in drm_lock()  local
62 ++file_priv->lock_count; in drm_lock()
64 if (lock->context == DRM_KERNEL_CONTEXT) { in drm_lock()
65 DRM_ERROR("Process %d using kernel context %d\n", in drm_lock()
66 DRM_CURRENTPID, lock->context); in drm_lock()
67 return -EINVAL; in drm_lock()
71 lock->context, DRM_CURRENTPID, in drm_lock()
72 master->lock.hw_lock->lock, lock->flags); in drm_lock()
74 mtx_lock(&master->lock.spinlock); in drm_lock()
75 master->lock.user_waiters++; in drm_lock()
76 mtx_unlock(&master->lock.spinlock); in drm_lock()
80 if (!master->lock.hw_lock) { in drm_lock()
83 ret = -EINTR; in drm_lock()
87 if (drm_lock_take(&master->lock, lock->context)) { in drm_lock()
88 master->lock.file_priv = file_priv; in drm_lock()
89 master->lock.lock_time = jiffies; in drm_lock()
90 atomic_inc(&dev->counts[_DRM_STAT_LOCKS]); in drm_lock()
96 ret = -sx_sleep(&master->lock.lock_queue, &drm_global_mutex, in drm_lock()
98 if (ret == -ERESTART) in drm_lock()
99 ret = -ERESTARTSYS; in drm_lock()
103 mtx_lock(&master->lock.spinlock); in drm_lock()
104 master->lock.user_waiters--; in drm_lock()
105 mtx_unlock(&master->lock.spinlock); in drm_lock()
107 DRM_DEBUG("%d %s\n", lock->context, in drm_lock()
112 /* don't set the block all signals on the master process for now in drm_lock()
115 if (!file_priv->is_master) { in drm_lock()
116 sigemptyset(&dev->sigmask); in drm_lock()
117 sigaddset(&dev->sigmask, SIGSTOP); in drm_lock()
118 sigaddset(&dev->sigmask, SIGTSTP); in drm_lock()
119 sigaddset(&dev->sigmask, SIGTTIN); in drm_lock()
120 sigaddset(&dev->sigmask, SIGTTOU); in drm_lock()
121 dev->sigdata.context = lock->context; in drm_lock()
122 dev->sigdata.lock = master->lock.hw_lock; in drm_lock()
123 block_all_signals(drm_notifier, &dev->sigdata, &dev->sigmask); in drm_lock()
127 if (dev->driver->dma_quiescent && (lock->flags & _DRM_LOCK_QUIESCENT)) in drm_lock()
129 if (dev->driver->dma_quiescent(dev)) { in drm_lock()
131 lock->context); in drm_lock()
132 return -EBUSY; in drm_lock()
153 struct drm_master *master = file_priv->master; in drm_unlock() local
155 if (lock->context == DRM_KERNEL_CONTEXT) { in drm_unlock()
156 DRM_ERROR("Process %d using kernel context %d\n", in drm_unlock()
157 DRM_CURRENTPID, lock->context); in drm_unlock()
158 return -EINVAL; in drm_unlock()
161 atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]); in drm_unlock()
163 if (drm_lock_free(&master->lock, lock->context)) { in drm_unlock()
187 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_lock_take()
189 mtx_lock(&lock_data->spinlock); in drm_lock_take()
196 ((lock_data->user_waiters + lock_data->kernel_waiters > 1) ? in drm_lock_take()
201 mtx_unlock(&lock_data->spinlock); in drm_lock_take()
222 * inside *_unlock to give lock to kernel before calling *_dma_schedule.
236 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_lock_transfer()
238 lock_data->file_priv = NULL; in drm_lock_transfer()
261 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_lock_free()
263 mtx_lock(&lock_data->spinlock); in drm_lock_free()
264 if (lock_data->kernel_waiters != 0) { in drm_lock_free()
266 lock_data->idle_has_lock = 1; in drm_lock_free()
267 mtx_unlock(&lock_data->spinlock); in drm_lock_free()
270 mtx_unlock(&lock_data->spinlock); in drm_lock_free()
283 wake_up_interruptible(&lock_data->lock_queue); in drm_lock_free()
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()
322 * with the kernel context if it is free, otherwise it gets the highest priority when and if
325 * This guarantees that the kernel will _eventually_ have the lock _unless_ it is held
337 mtx_lock(&lock_data->spinlock); in drm_idlelock_take()
338 lock_data->kernel_waiters++; in drm_idlelock_take()
339 if (!lock_data->idle_has_lock) { in drm_idlelock_take()
341 mtx_unlock(&lock_data->spinlock); in drm_idlelock_take()
343 mtx_lock(&lock_data->spinlock); in drm_idlelock_take()
346 lock_data->idle_has_lock = 1; in drm_idlelock_take()
348 mtx_unlock(&lock_data->spinlock); in drm_idlelock_take()
355 volatile unsigned int *lock = &lock_data->hw_lock->lock; in drm_idlelock_release()
357 mtx_lock(&lock_data->spinlock); in drm_idlelock_release()
358 if (--lock_data->kernel_waiters == 0) { in drm_idlelock_release()
359 if (lock_data->idle_has_lock) { in drm_idlelock_release()
364 wake_up_interruptible(&lock_data->lock_queue); in drm_idlelock_release()
365 lock_data->idle_has_lock = 0; in drm_idlelock_release()
368 mtx_unlock(&lock_data->spinlock); in drm_idlelock_release()
374 struct drm_master *master = file_priv->master; in drm_i_have_hw_lock() local
375 return (file_priv->lock_count && master->lock.hw_lock && in drm_i_have_hw_lock()
376 _DRM_LOCK_IS_HELD(master->lock.hw_lock->lock) && in drm_i_have_hw_lock()
377 master->lock.file_priv == file_priv); in drm_i_have_hw_lock()