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