summaryrefslogtreecommitdiffstats
path: root/sys/dev/drm/drm_lock.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/drm/drm_lock.h')
-rw-r--r--sys/dev/drm/drm_lock.h150
1 files changed, 4 insertions, 146 deletions
diff --git a/sys/dev/drm/drm_lock.h b/sys/dev/drm/drm_lock.h
index de07146..f093707 100644
--- a/sys/dev/drm/drm_lock.h
+++ b/sys/dev/drm/drm_lock.h
@@ -33,18 +33,6 @@
#include "dev/drm/drmP.h"
-int DRM(block)( DRM_IOCTL_ARGS )
-{
- DRM_DEBUG("\n");
- return 0;
-}
-
-int DRM(unblock)( DRM_IOCTL_ARGS )
-{
- DRM_DEBUG("\n");
- return 0;
-}
-
int DRM(lock_take)(__volatile__ unsigned int *lock, unsigned int context)
{
unsigned int old, new;
@@ -78,7 +66,7 @@ int DRM(lock_transfer)(drm_device_t *dev,
{
unsigned int old, new;
- dev->lock.pid = 0;
+ dev->lock.filp = NULL;
do {
old = *lock;
new = context | _DRM_LOCK_HELD;
@@ -91,149 +79,19 @@ int DRM(lock_free)(drm_device_t *dev,
__volatile__ unsigned int *lock, unsigned int context)
{
unsigned int old, new;
- pid_t pid = dev->lock.pid;
- dev->lock.pid = 0;
+ dev->lock.filp = NULL;
do {
old = *lock;
new = 0;
} while (!atomic_cmpset_int(lock, old, new));
if (_DRM_LOCK_IS_HELD(old) && _DRM_LOCKING_CONTEXT(old) != context) {
- DRM_ERROR("%d freed heavyweight lock held by %d (pid %d)\n",
- context,
- _DRM_LOCKING_CONTEXT(old),
- pid);
+ DRM_ERROR("%d freed heavyweight lock held by %d\n",
+ context, _DRM_LOCKING_CONTEXT(old));
return 1;
}
DRM_WAKEUP_INT((void *)&dev->lock.lock_queue);
return 0;
}
-static int DRM(flush_queue)(drm_device_t *dev, int context)
-{
- int error;
- int ret = 0;
- drm_queue_t *q = dev->queuelist[context];
-
- DRM_DEBUG("\n");
-
- atomic_inc(&q->use_count);
- if (atomic_read(&q->use_count) > 1) {
- atomic_inc(&q->block_write);
- atomic_inc(&q->block_count);
- error = tsleep((void *)&q->flush_queue, PZERO|PCATCH, "drmfq", 0);
- if (error)
- return error;
- atomic_dec(&q->block_count);
- }
- atomic_dec(&q->use_count);
-
- /* NOTE: block_write is still incremented!
- Use drm_flush_unlock_queue to decrement. */
- return ret;
-}
-
-static int DRM(flush_unblock_queue)(drm_device_t *dev, int context)
-{
- drm_queue_t *q = dev->queuelist[context];
-
- DRM_DEBUG("\n");
-
- atomic_inc(&q->use_count);
- if (atomic_read(&q->use_count) > 1) {
- if (atomic_read(&q->block_write)) {
- atomic_dec(&q->block_write);
- DRM_WAKEUP_INT((void *)&q->write_queue);
- }
- }
- atomic_dec(&q->use_count);
- return 0;
-}
-
-int DRM(flush_block_and_flush)(drm_device_t *dev, int context,
- drm_lock_flags_t flags)
-{
- int ret = 0;
- int i;
-
- DRM_DEBUG("\n");
-
- if (flags & _DRM_LOCK_FLUSH) {
- ret = DRM(flush_queue)(dev, DRM_KERNEL_CONTEXT);
- if (!ret) ret = DRM(flush_queue)(dev, context);
- }
- if (flags & _DRM_LOCK_FLUSH_ALL) {
- for (i = 0; !ret && i < dev->queue_count; i++) {
- ret = DRM(flush_queue)(dev, i);
- }
- }
- return ret;
-}
-
-int DRM(flush_unblock)(drm_device_t *dev, int context, drm_lock_flags_t flags)
-{
- int ret = 0;
- int i;
-
- DRM_DEBUG("\n");
-
- if (flags & _DRM_LOCK_FLUSH) {
- ret = DRM(flush_unblock_queue)(dev, DRM_KERNEL_CONTEXT);
- if (!ret) ret = DRM(flush_unblock_queue)(dev, context);
- }
- if (flags & _DRM_LOCK_FLUSH_ALL) {
- for (i = 0; !ret && i < dev->queue_count; i++) {
- ret = DRM(flush_unblock_queue)(dev, i);
- }
- }
-
- return ret;
-}
-
-int DRM(finish)( DRM_IOCTL_ARGS )
-{
- DRM_DEVICE;
- int ret = 0;
- drm_lock_t lock;
-
- DRM_DEBUG("\n");
-
- DRM_COPY_FROM_USER_IOCTL( lock, (drm_lock_t *)data, sizeof(lock) );
-
- ret = DRM(flush_block_and_flush)(dev, lock.context, lock.flags);
- DRM(flush_unblock)(dev, lock.context, lock.flags);
- return ret;
-}
-
-/* If we get here, it means that the process has called DRM_IOCTL_LOCK
- without calling DRM_IOCTL_UNLOCK.
-
- If the lock is not held, then let the signal proceed as usual.
-
- If the lock is held, then set the contended flag and keep the signal
- blocked.
-
-
- Return 1 if the signal should be delivered normally.
- Return 0 if the signal should be blocked. */
-
-int DRM(notifier)(void *priv)
-{
- drm_sigdata_t *s = (drm_sigdata_t *)priv;
- unsigned int old, new;
-
- /* Allow signal delivery if lock isn't held */
- if (!_DRM_LOCK_IS_HELD(s->lock->lock)
- || _DRM_LOCKING_CONTEXT(s->lock->lock) != s->context) return 1;
-
- /* Otherwise, set flag to force call to
- drmUnlock */
- do {
- old = s->lock->lock;
- new = old | _DRM_LOCK_CONT;
- } while (!atomic_cmpset_int(&s->lock->lock, old, new));
-
- return 0;
-}
-
OpenPOWER on IntegriCloud