浏览代码

drm/i915: fixup interrupted overlay switch off calls

When switching to interruptible sleeps in the overlay code, I've
forgotten to recover from interruptions at one site.  This
resulted in the overlay still running when it should have been
switched off. This in turn caused a hang on resume because it
tried to disable the (not-running) overlay in preparation for the
resume modeset.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=24980
Tested-by: maximlevitsky@gmail.com

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Eric Anholt <eric@anholt.net>
Daniel Vetter 15 年之前
父节点
当前提交
9bedb9743f
共有 1 个文件被更改,包括 6 次插入3 次删除
  1. 6 3
      drivers/gpu/drm/i915/intel_overlay.c

+ 6 - 3
drivers/gpu/drm/i915/intel_overlay.c

@@ -842,12 +842,15 @@ int intel_overlay_switch_off(struct intel_overlay *overlay)
 	BUG_ON(!mutex_is_locked(&dev->struct_mutex));
 	BUG_ON(!mutex_is_locked(&dev->struct_mutex));
 	BUG_ON(!mutex_is_locked(&dev->mode_config.mutex));
 	BUG_ON(!mutex_is_locked(&dev->mode_config.mutex));
 
 
+	if (overlay->hw_wedged) {
+		ret = intel_overlay_recover_from_interrupt(overlay, 1);
+		if (ret != 0)
+			return ret;
+	}
+
 	if (!overlay->active)
 	if (!overlay->active)
 		return 0;
 		return 0;
 
 
-	if (overlay->hw_wedged)
-		return -EBUSY;
-
 	ret = intel_overlay_release_old_vid(overlay);
 	ret = intel_overlay_release_old_vid(overlay);
 	if (ret != 0)
 	if (ret != 0)
 		return ret;
 		return ret;