浏览代码

drm/i915: unload: ensure that gem is idle

When the module unloads, all users should be gone, hence all bo references
held by userspace, too. This should already result in an idle ringbuffer.
Still, be paranoid and idle gem before starting the unload dance.

Also kill the call to i915_gem_lastclose under an if (kms), it's a noop
for kms.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Daniel Vetter 15 年之前
父节点
当前提交
c911fc1c6a
共有 1 个文件被更改,包括 7 次插入1 次删除
  1. 7 1
      drivers/gpu/drm/i915/i915_dma.c

+ 7 - 1
drivers/gpu/drm/i915/i915_dma.c

@@ -2249,11 +2249,18 @@ free_priv:
 int i915_driver_unload(struct drm_device *dev)
 int i915_driver_unload(struct drm_device *dev)
 {
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_i915_private *dev_priv = dev->dev_private;
+	int ret;
 
 
 	spin_lock(&mchdev_lock);
 	spin_lock(&mchdev_lock);
 	i915_mch_dev = NULL;
 	i915_mch_dev = NULL;
 	spin_unlock(&mchdev_lock);
 	spin_unlock(&mchdev_lock);
 
 
+	mutex_lock(&dev->struct_mutex);
+	ret = i915_gpu_idle(dev);
+	if (ret)
+		DRM_ERROR("failed to idle hardware: %d\n", ret);
+	mutex_unlock(&dev->struct_mutex);
+
 	io_mapping_free(dev_priv->mm.gtt_mapping);
 	io_mapping_free(dev_priv->mm.gtt_mapping);
 	if (dev_priv->mm.gtt_mtrr >= 0) {
 	if (dev_priv->mm.gtt_mtrr >= 0) {
 		mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base,
 		mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base,
@@ -2303,7 +2310,6 @@ int i915_driver_unload(struct drm_device *dev)
 		if (I915_HAS_FBC(dev) && i915_powersave)
 		if (I915_HAS_FBC(dev) && i915_powersave)
 			i915_cleanup_compression(dev);
 			i915_cleanup_compression(dev);
 		drm_mm_takedown(&dev_priv->vram);
 		drm_mm_takedown(&dev_priv->vram);
-		i915_gem_lastclose(dev);
 
 
 		intel_cleanup_overlay(dev);
 		intel_cleanup_overlay(dev);
 	}
 	}