From c2d7ff1bf98f92add98fb76b63d2bdb190f3cf2c Mon Sep 17 00:00:00 2001 From: David Dawes Date: Thu, 17 Apr 2003 18:41:28 +0000 Subject: Bring some drm module changes over from the XFree86 trunk: - Reset 'bound' flag for an agp entry after undbind succeeded in drm_agpsupport.h (Egbert Eich). - Ignore hw_lock for drm device if lock was set by a different instance (ie Xserver) to prevent second server from spinning in driver release function (currently only relevant for i8xx drm drivers) (David Dawes). - Use the agpgart "key" for the unique handle for bindings rather than the memory address (the key is guaranteed to be unique) (David Dawes). --- linux-core/drm_drv.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'linux-core/drm_drv.c') diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index 0a4f3aeb..b2070d32 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -766,7 +766,7 @@ int DRM(release)( struct inode *inode, struct file *filp ) DRM_DEBUG( "pid = %d, device = 0x%lx, open_count = %d\n", current->pid, (long)dev->device, dev->open_count ); - if ( dev->lock.hw_lock && + if ( priv->lock_count && dev->lock.hw_lock && _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) && dev->lock.filp == filp ) { DRM_DEBUG( "File %p released, freeing lock for context %d\n", @@ -784,7 +784,7 @@ int DRM(release)( struct inode *inode, struct file *filp ) server. */ } #if __HAVE_RELEASE - else if ( dev->lock.hw_lock ) { + else if ( priv->lock_count && dev->lock.hw_lock ) { /* The lock is required to reclaim buffers */ DECLARE_WAITQUEUE( entry, current ); @@ -933,6 +933,8 @@ int DRM(lock)( struct inode *inode, struct file *filp, dev->lck_start = start = get_cycles(); #endif + ++priv->lock_count; + if ( copy_from_user( &lock, (drm_lock_t *)arg, sizeof(lock) ) ) return -EFAULT; -- cgit v1.2.3