summaryrefslogtreecommitdiff
path: root/linux-core/drm_lock.c
diff options
context:
space:
mode:
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2006-10-02 13:34:30 +0200
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>2006-10-02 13:34:30 +0200
commitc6be27401fbc12ec72bac13d07e3cc93bd63732a (patch)
treeaeb57729c3005fb3e214cf91743e88e0a2879230 /linux-core/drm_lock.c
parent58a23d193f7d25d23c76a58c192c814a415a843b (diff)
Trap and be verbose about a deadlock that occurs with AIGLX and drivers that
use drm_reclaim_buffers_locked().
Diffstat (limited to 'linux-core/drm_lock.c')
-rw-r--r--linux-core/drm_lock.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/linux-core/drm_lock.c b/linux-core/drm_lock.c
index 04c145a6..0cf183a7 100644
--- a/linux-core/drm_lock.c
+++ b/linux-core/drm_lock.c
@@ -343,6 +343,7 @@ int drm_kernel_take_hw_lock(struct file *filp)
DRM_DEVICE;
int ret = 0;
+ unsigned long _end = jiffies + 3*DRM_HZ;
if (!drm_i_have_hw_lock(filp)) {
@@ -364,7 +365,12 @@ int drm_kernel_take_hw_lock(struct file *filp)
break; /* Got lock */
}
/* Contention */
- schedule();
+ if (time_after_eq(jiffies,_end)) {
+ ret = -EBUSY;
+ break;
+ }
+
+ schedule_timeout(1);
if (signal_pending(current)) {
ret = -ERESTARTSYS;
break;