rpms/kernel/devel kernel.spec, 1.497, 1.498 linux-2.6-drm-i915-modeset.patch, 1.4, 1.5

Dave Airlie (airlied) fedora-extras-commits at redhat.com
Wed Mar 12 05:09:54 UTC 2008


Author: airlied

Update of /cvs/pkgs/rpms/kernel/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv5186

Modified Files:
	kernel.spec linux-2.6-drm-i915-modeset.patch 
Log Message:
* Wed Mar 12 2008 Dave Airlie <airlied at redhat.com>
- drm: fix oops on i915 driver when X crashes



Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.497
retrieving revision 1.498
diff -u -r1.497 -r1.498
--- kernel.spec	12 Mar 2008 01:52:59 -0000	1.497
+++ kernel.spec	12 Mar 2008 05:09:07 -0000	1.498
@@ -1752,6 +1752,9 @@
 %kernel_variant_files -a /%{image_install_path}/xen*-%{KVERREL} -e /etc/ld.so.conf.d/kernelcap-%{KVERREL}.conf %{with_xen} xen
 
 %changelog
+* Wed Mar 12 2008 Dave Airlie <airlied at redhat.com>
+- drm: fix oops on i915 driver when X crashes
+
 * Tue Mar 11 2008 John W. Linville <linville at redhat.com>
 - rt2x00:correct rx packet length for USB devices
 - make b43_mac_{enable,suspend}() static

linux-2.6-drm-i915-modeset.patch:

Index: linux-2.6-drm-i915-modeset.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/linux-2.6-drm-i915-modeset.patch,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- linux-2.6-drm-i915-modeset.patch	11 Mar 2008 06:52:18 -0000	1.4
+++ linux-2.6-drm-i915-modeset.patch	12 Mar 2008 05:09:07 -0000	1.5
@@ -5036,7 +5036,7 @@
  	struct drm_fence_object *fence;
  
 diff --git a/drivers/char/drm/drm_fops.c b/drivers/char/drm/drm_fops.c
-index a5920dc..ed80748 100644
+index a5920dc..c09e4a4 100644
 --- a/drivers/char/drm/drm_fops.c
 +++ b/drivers/char/drm/drm_fops.c
 @@ -43,10 +43,8 @@ static int drm_open_helper(struct inode *inode, struct file *filp,
@@ -5093,13 +5093,13 @@
  	int retcode = 0;
  
 -	if (!((minor >= 0) && (minor < drm_cards_limit)))
--		return -ENODEV;
--
--	if (!drm_heads[minor])
 +	minor = idr_find(&drm_minors_idr, minor_id);
 +	if (!minor)
  		return -ENODEV;
  
+-	if (!drm_heads[minor])
+-		return -ENODEV;
+-
 -	if (!(dev = drm_heads[minor]->dev))
 +	if (!(dev = minor->dev))
  		return -ENODEV;
@@ -5126,13 +5126,13 @@
  	DRM_DEBUG("\n");
  
 -	if (!((minor >= 0) && (minor < drm_cards_limit)))
+-		return -ENODEV;
+-
+-	if (!drm_heads[minor])
 +	minor = idr_find(&drm_minors_idr, minor_id);
 +	if (!minor)
  		return -ENODEV;
 -
--	if (!drm_heads[minor])
--		return -ENODEV;
--
 -	if (!(dev = drm_heads[minor]->dev))
 +	
 +	if (!(dev = minor->dev))
@@ -5192,7 +5192,7 @@
 +			ret = -ENOMEM;
 +			goto out_free;
 +		}
-+
+ 
 +		priv->is_master = 1;
 +		priv->master = priv->minor->master;
 +
@@ -5210,7 +5210,7 @@
 +		priv->master = priv->minor->master;
 +		mutex_unlock(&dev->struct_mutex);
 +	}
- 
++
 +	mutex_lock(&dev->struct_mutex);
  	list_add(&priv->lhead, &dev->filelist);
  	mutex_unlock(&dev->struct_mutex);
@@ -5238,7 +5238,7 @@
  	int retcode = 0;
  
  	lock_kernel();
-@@ -387,27 +397,26 @@ int drm_release(struct inode *inode, struct file *filp)
+@@ -387,63 +397,65 @@ int drm_release(struct inode *inode, struct file *filp)
  	 */
  
  	DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n",
@@ -5248,64 +5248,109 @@
  		  dev->open_count);
  
 -	if (dev->driver->reclaim_buffers_locked && dev->lock.hw_lock) {
-+	if (dev->driver->reclaim_buffers_locked && file_priv->master->lock.hw_lock) {
- 		if (drm_i_have_hw_lock(dev, file_priv)) {
- 			dev->driver->reclaim_buffers_locked(dev, file_priv);
- 		} else {
- 			unsigned long _end = jiffies + 3*DRM_HZ;
- 			int locked = 0;
- 
+-		if (drm_i_have_hw_lock(dev, file_priv)) {
+-			dev->driver->reclaim_buffers_locked(dev, file_priv);
+-		} else {
+-			unsigned long _end = jiffies + 3*DRM_HZ;
+-			int locked = 0;
+-
 -			drm_idlelock_take(&dev->lock);
-+			drm_idlelock_take(&file_priv->master->lock);
- 
- 			/*
- 			 * Wait for a while.
- 			 */
- 
+-
+-			/*
+-			 * Wait for a while.
+-			 */
+-
 -			do {
 -				spin_lock(&dev->lock.spinlock);
 -				locked = dev->lock.idle_has_lock;
 -				spin_unlock(&dev->lock.spinlock);
-+			do{
-+				spin_lock(&file_priv->master->lock.spinlock);
-+				locked = file_priv->master->lock.idle_has_lock;
-+				spin_unlock(&file_priv->master->lock.spinlock);
- 				if (locked)
- 					break;
- 				schedule();
-@@ -420,24 +429,24 @@ int drm_release(struct inode *inode, struct file *filp)
+-				if (locked)
+-					break;
+-				schedule();
+-			} while (!time_after_eq(jiffies, _end));
+-
+-			if (!locked) {
+-				DRM_ERROR("reclaim_buffers_locked() deadlock. Please rework this\n"
+-					  "\tdriver to use reclaim_buffers_idlelocked() instead.\n"
+-					  "\tI will go on reclaiming the buffers anyway.\n");
++	/* if the master has gone away we can't do anything with the lock */
++	if (file_priv->minor->master) {
++		if (dev->driver->reclaim_buffers_locked && file_priv->master->lock.hw_lock) {
++			if (drm_i_have_hw_lock(dev, file_priv)) {
++				dev->driver->reclaim_buffers_locked(dev, file_priv);
++			} else {
++				unsigned long _end = jiffies + 3*DRM_HZ;
++				int locked = 0;
++
++				drm_idlelock_take(&file_priv->master->lock);
++
++				/*
++				 * Wait for a while.
++				 */
++
++				do{
++					spin_lock(&file_priv->master->lock.spinlock);
++					locked = file_priv->master->lock.idle_has_lock;
++					spin_unlock(&file_priv->master->lock.spinlock);
++					if (locked)
++						break;
++					schedule();
++				} while (!time_after_eq(jiffies, _end));
++
++				if (!locked) {
++					DRM_ERROR("reclaim_buffers_locked() deadlock. Please rework this\n"
++						  "\tdriver to use reclaim_buffers_idlelocked() instead.\n"
++						  "\tI will go on reclaiming the buffers anyway.\n");
++				}
++
++				dev->driver->reclaim_buffers_locked(dev, file_priv);
++				drm_idlelock_release(&file_priv->master->lock);
  			}
- 
- 			dev->driver->reclaim_buffers_locked(dev, file_priv);
+-
+-			dev->driver->reclaim_buffers_locked(dev, file_priv);
 -			drm_idlelock_release(&dev->lock);
-+			drm_idlelock_release(&file_priv->master->lock);
  		}
- 	}
+-	}
  
 -	if (dev->driver->reclaim_buffers_idlelocked && dev->lock.hw_lock) {
-+	if (dev->driver->reclaim_buffers_idlelocked && file_priv->master->lock.hw_lock) {
++		if (dev->driver->reclaim_buffers_idlelocked && file_priv->master->lock.hw_lock) {
  
 -		drm_idlelock_take(&dev->lock);
-+		drm_idlelock_take(&file_priv->master->lock);
- 		dev->driver->reclaim_buffers_idlelocked(dev, file_priv);
+-		dev->driver->reclaim_buffers_idlelocked(dev, file_priv);
 -		drm_idlelock_release(&dev->lock);
-+		drm_idlelock_release(&file_priv->master->lock);
++			drm_idlelock_take(&file_priv->master->lock);
++			dev->driver->reclaim_buffers_idlelocked(dev, file_priv);
++			drm_idlelock_release(&file_priv->master->lock);
  
- 	}
+-	}
++		}
  
- 	if (drm_i_have_hw_lock(dev, file_priv)) {
- 		DRM_DEBUG("File %p released, freeing lock for context %d\n",
+-	if (drm_i_have_hw_lock(dev, file_priv)) {
+-		DRM_DEBUG("File %p released, freeing lock for context %d\n",
 -			  filp, _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
-+			  filp, _DRM_LOCKING_CONTEXT(file_priv->master->lock.hw_lock->lock));
++		if (drm_i_have_hw_lock(dev, file_priv)) {
++			DRM_DEBUG("File %p released, freeing lock for context %d\n",
++				  filp, _DRM_LOCKING_CONTEXT(file_priv->master->lock.hw_lock->lock));
  
 -		drm_lock_free(&dev->lock,
 -			      _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
-+		drm_lock_free(&file_priv->master->lock,
-+			      _DRM_LOCKING_CONTEXT(file_priv->master->lock.hw_lock->lock));
- 	}
+-	}
++			drm_lock_free(&file_priv->master->lock,
++				      _DRM_LOCKING_CONTEXT(file_priv->master->lock.hw_lock->lock));
++		}
+ 
  
+-	if (drm_core_check_feature(dev, DRIVER_HAVE_DMA) &&
+-	    !dev->driver->reclaim_buffers_locked) {
+-		dev->driver->reclaim_buffers(dev, file_priv);
++		if (drm_core_check_feature(dev, DRIVER_HAVE_DMA) &&
++		    !dev->driver->reclaim_buffers_locked) {
++			dev->driver->reclaim_buffers(dev, file_priv);
++		}
+ 	}
  
-@@ -469,6 +478,16 @@ int drm_release(struct inode *inode, struct file *filp)
+ 	drm_fasync(-1, filp, 0);
+@@ -469,6 +481,16 @@ int drm_release(struct inode *inode, struct file *filp)
  	}
  	mutex_unlock(&dev->ctxlist_mutex);
  
@@ -5322,7 +5367,7 @@
  	mutex_lock(&dev->struct_mutex);
  	drm_object_release(filp);
  	if (file_priv->remove_auth_on_close == 1) {
-@@ -491,9 +510,9 @@ int drm_release(struct inode *inode, struct file *filp)
+@@ -491,9 +513,9 @@ int drm_release(struct inode *inode, struct file *filp)
  	atomic_inc(&dev->counts[_DRM_STAT_CLOSES]);
  	spin_lock(&dev->count_lock);
  	if (!--dev->open_count) {




More information about the fedora-extras-commits mailing list