summaryrefslogtreecommitdiff
path: root/linux-core/drm_fops.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_fops.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_fops.c')
-rw-r--r--linux-core/drm_fops.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/linux-core/drm_fops.c b/linux-core/drm_fops.c
index dcc05a0a..e4385cf6 100644
--- a/linux-core/drm_fops.c
+++ b/linux-core/drm_fops.c
@@ -421,14 +421,26 @@ int drm_release(struct inode *inode, struct file *filp)
dev->open_count);
if (dev->driver->reclaim_buffers_locked) {
- retcode = drm_kernel_take_hw_lock(filp);
+ unsigned long _end = jiffies + DRM_HZ*3;
+
+ do {
+ retcode = drm_kernel_take_hw_lock(filp);
+ } while(retcode && !time_after_eq(jiffies,_end));
+
if (!retcode) {
dev->driver->reclaim_buffers_locked(dev, filp);
drm_lock_free(dev, &dev->lock.hw_lock->lock,
_DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
+ } else {
+ DRM_ERROR("Reclaim buffers locked deadlock.\n");
+ DRM_ERROR("This is probably a single thread having multiple\n");
+ DRM_ERROR("DRM file descriptors open either dying or "
+ "closing file descriptors\n");
+ DRM_ERROR("while having the lock. I will not reclaim buffers.\n");
+ DRM_ERROR("Locking context is 0x%08x\n",
+ _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
}
-
} else if (drm_i_have_hw_lock(filp)) {
DRM_DEBUG("File %p released, freeing lock for context %d\n",
filp, _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));