diff options
author | Thomas Hellstrom <thomas-at-tungstengraphics-dot-com> | 2008-04-28 12:10:44 +0200 |
---|---|---|
committer | Thomas Hellstrom <thomas-at-tungstengraphics-dot-com> | 2008-04-28 12:10:44 +0200 |
commit | 7f269bec7ed49385de394fdbd970f463ef2060f0 (patch) | |
tree | 8c45f8c2e11cf101350272f81892cf4cf7678c3a /linux-core/drm_lock.c | |
parent | 55a9941977953d16b36bbf3e1dcad392ac70e1ef (diff) | |
parent | 7f8e4060859651993921281445ec00940c577222 (diff) |
Merge branch 'master' into modesetting-101
Conflicts:
linux-core/Makefile.kernel
linux-core/drm_compat.c
linux-core/drm_fops.c
linux-core/drm_lock.c
shared-core/drm.h
shared-core/i915_dma.c
shared-core/i915_drv.h
shared-core/i915_irq.c
Diffstat (limited to 'linux-core/drm_lock.c')
-rw-r--r-- | linux-core/drm_lock.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/linux-core/drm_lock.c b/linux-core/drm_lock.c index 08e063d8..6bbf1444 100644 --- a/linux-core/drm_lock.c +++ b/linux-core/drm_lock.c @@ -72,9 +72,10 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv) return -EINVAL; add_wait_queue(&master->lock.lock_queue, &entry); - spin_lock(&master->lock.spinlock); + spin_lock_bh(&master->lock.spinlock); master->lock.user_waiters++; - spin_unlock(&master->lock.spinlock); + spin_unlock_bh(&master->lock.spinlock); + for (;;) { __set_current_state(TASK_INTERRUPTIBLE); if (!master->lock.hw_lock) { @@ -96,9 +97,9 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv) break; } } - spin_lock(&master->lock.spinlock); + spin_lock_bh(&master->lock.spinlock); master->lock.user_waiters--; - spin_unlock(&master->lock.spinlock); + spin_unlock_bh(&master->lock.spinlock); __set_current_state(TASK_RUNNING); remove_wait_queue(&master->lock.lock_queue, &entry); @@ -201,7 +202,7 @@ int drm_lock_take(struct drm_lock_data *lock_data, unsigned int old, new, prev; volatile unsigned int *lock = &lock_data->hw_lock->lock; - spin_lock(&lock_data->spinlock); + spin_lock_bh(&lock_data->spinlock); do { old = *lock; if (old & _DRM_LOCK_HELD) @@ -213,7 +214,7 @@ int drm_lock_take(struct drm_lock_data *lock_data, } prev = cmpxchg(lock, old, new); } while (prev != old); - spin_unlock(&lock_data->spinlock); + spin_unlock_bh(&lock_data->spinlock); if (_DRM_LOCKING_CONTEXT(old) == context) { if (old & _DRM_LOCK_HELD) { @@ -276,14 +277,14 @@ int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context) unsigned int old, new, prev; volatile unsigned int *lock = &lock_data->hw_lock->lock; - spin_lock(&lock_data->spinlock); + spin_lock_bh(&lock_data->spinlock); if (lock_data->kernel_waiters != 0) { drm_lock_transfer(lock_data, 0); lock_data->idle_has_lock = 1; - spin_unlock(&lock_data->spinlock); + spin_unlock_bh(&lock_data->spinlock); return 1; } - spin_unlock(&lock_data->spinlock); + spin_unlock_bh(&lock_data->spinlock); do { old = *lock; @@ -348,18 +349,18 @@ void drm_idlelock_take(struct drm_lock_data *lock_data) { int ret = 0; - spin_lock(&lock_data->spinlock); + spin_lock_bh(&lock_data->spinlock); lock_data->kernel_waiters++; if (!lock_data->idle_has_lock) { - spin_unlock(&lock_data->spinlock); + spin_unlock_bh(&lock_data->spinlock); ret = drm_lock_take(lock_data, DRM_KERNEL_CONTEXT); - spin_lock(&lock_data->spinlock); + spin_lock_bh(&lock_data->spinlock); if (ret == 1) lock_data->idle_has_lock = 1; } - spin_unlock(&lock_data->spinlock); + spin_unlock_bh(&lock_data->spinlock); } EXPORT_SYMBOL(drm_idlelock_take); @@ -368,7 +369,7 @@ void drm_idlelock_release(struct drm_lock_data *lock_data) unsigned int old, prev; volatile unsigned int *lock = &lock_data->hw_lock->lock; - spin_lock(&lock_data->spinlock); + spin_lock_bh(&lock_data->spinlock); if (--lock_data->kernel_waiters == 0) { if (lock_data->idle_has_lock) { do { @@ -379,7 +380,7 @@ void drm_idlelock_release(struct drm_lock_data *lock_data) lock_data->idle_has_lock = 0; } } - spin_unlock(&lock_data->spinlock); + spin_unlock_bh(&lock_data->spinlock); } EXPORT_SYMBOL(drm_idlelock_release); |