All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chris Wilson <chris@chris-wilson.co.uk>
To: intel-gfx@lists.freedesktop.org
Subject: [PATCH] drm/i915: Unwind i915_gem_init() failure
Date: Thu,  7 Dec 2017 23:56:25 +0000	[thread overview]
Message-ID: <20171207235625.9135-1-chris@chris-wilson.co.uk> (raw)

Since Michal introduced new errors other than -EIO during
i915_gem_init(), we need to actually unwind on the error path as we have
to abort the module load (and we expect to do so cleanly!).

As we now teardown key state and then mark the driver as wedged (on
EIO), we have to be careful to not allow ourselves to resume and
unwedge, thus attempting to use the uninitialised driver.

References: 8620eb1dbbf2 ("drm/i915/uc: Don't use -EIO to report missing firmware")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
---
 drivers/gpu/drm/i915/i915_gem.c | 55 ++++++++++++++++++++++++++++++++---------
 1 file changed, 43 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 67dc11effc8e..a6a7ce861c37 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3245,7 +3245,12 @@ bool i915_gem_unset_wedged(struct drm_i915_private *i915)
 	if (!test_bit(I915_WEDGED, &i915->gpu_error.flags))
 		return true;
 
-	/* Before unwedging, make sure that all pending operations
+	/* Never successfully initialised, so can not unwedge? */
+	if (!i915->kernel_context)
+		return false;
+
+	/*
+	 * Before unwedging, make sure that all pending operations
 	 * are flushed and errored out - we may have requests waiting upon
 	 * third party fences. We marked all inflight requests as EIO, and
 	 * every execbuf since returned EIO, for consistency we want all
@@ -4863,7 +4868,8 @@ void i915_gem_resume(struct drm_i915_private *i915)
 	i915_gem_restore_gtt_mappings(i915);
 	i915_gem_restore_fences(i915);
 
-	/* As we didn't flush the kernel context before suspend, we cannot
+	/*
+	 * As we didn't flush the kernel context before suspend, we cannot
 	 * guarantee that the context image is complete. So let's just reset
 	 * it and start again.
 	 */
@@ -4884,8 +4890,10 @@ void i915_gem_resume(struct drm_i915_private *i915)
 	return;
 
 err_wedged:
-	DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n");
-	i915_gem_set_wedged(i915);
+	if (!i915_terminally_wedged(&i915->gpu_error)) {
+		DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n");
+		i915_gem_set_wedged(i915);
+	}
 	goto out_unlock;
 }
 
@@ -5169,21 +5177,21 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
 
 	ret = i915_gem_init_ggtt(dev_priv);
 	if (ret)
-		goto out_unlock;
+		goto err_unlock;
 
 	ret = i915_gem_contexts_init(dev_priv);
 	if (ret)
-		goto out_unlock;
+		goto err_ggtt;
 
 	ret = intel_engines_init(dev_priv);
 	if (ret)
-		goto out_unlock;
+		goto err_context;
 
 	intel_init_gt_powersave(dev_priv);
 
 	ret = i915_gem_init_hw(dev_priv);
 	if (ret)
-		goto out_unlock;
+		goto err_pm;
 
 	/*
 	 * Despite its name intel_init_clock_gating applies both display
@@ -5197,9 +5205,33 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
 	intel_init_clock_gating(dev_priv);
 
 	ret = __intel_engines_record_defaults(dev_priv);
-out_unlock:
+	if (ret)
+		goto err_init_hw;
+
+	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
+	mutex_unlock(&dev_priv->drm.struct_mutex);
+
+	return 0;
+
+err_init_hw:
+	i915_gem_wait_for_idle(dev_priv, I915_WAIT_LOCKED);
+	i915_gem_contexts_lost(dev_priv);
+	intel_uc_fini_hw(dev_priv);
+err_pm:
+	intel_cleanup_gt_powersave(dev_priv);
+	i915_gem_cleanup_engines(dev_priv);
+err_context:
+	i915_gem_contexts_fini(dev_priv);
+err_ggtt:
+err_unlock:
+	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
+	mutex_unlock(&dev_priv->drm.struct_mutex);
+
+	i915_gem_cleanup_userptr(dev_priv);
+
 	if (ret == -EIO) {
-		/* Allow engine initialisation to fail by marking the GPU as
+		/*
+		 * Allow engine initialisation to fail by marking the GPU as
 		 * wedged. But we only want to do this where the GPU is angry,
 		 * for all other failure, such as an allocation failure, bail.
 		 */
@@ -5209,9 +5241,8 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
 		}
 		ret = 0;
 	}
-	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
-	mutex_unlock(&dev_priv->drm.struct_mutex);
 
+	i915_gem_drain_freed_objects(dev_priv);
 	return ret;
 }
 
-- 
2.15.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

             reply	other threads:[~2017-12-07 23:56 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-07 23:56 Chris Wilson [this message]
2017-12-08  0:20 ` ✓ Fi.CI.BAT: success for drm/i915: Unwind i915_gem_init() failure Patchwork
2017-12-08  0:29 ` [PATCH] " Chris Wilson
2017-12-08  1:17 ` [PATCH v2] " Chris Wilson
2017-12-08 22:32   ` Michał Winiarski
2017-12-08 22:46     ` Chris Wilson
2017-12-08  1:53 ` ✓ Fi.CI.BAT: success for drm/i915: Unwind i915_gem_init() failure (rev2) Patchwork
2017-12-08  2:17 ` ✗ Fi.CI.IGT: warning for drm/i915: Unwind i915_gem_init() failure Patchwork
2017-12-08  3:34 ` ✗ Fi.CI.IGT: failure for drm/i915: Unwind i915_gem_init() failure (rev2) Patchwork
2017-12-11 11:19 ` [PATCH v3] drm/i915: Unwind i915_gem_init() failure Chris Wilson
2017-12-11 13:04 ` ✓ Fi.CI.BAT: success for drm/i915: Unwind i915_gem_init() failure (rev3) Patchwork
2017-12-11 13:17   ` Chris Wilson
2017-12-11 14:27 ` ✗ Fi.CI.IGT: failure " Patchwork
2017-12-13 13:43 ` [PATCH v3] drm/i915: Unwind i915_gem_init() failure Chris Wilson
2017-12-13 15:55 ` ✓ Fi.CI.BAT: success for drm/i915: Unwind i915_gem_init() failure (rev4) Patchwork
2017-12-13 18:26 ` ✗ Fi.CI.IGT: warning " Patchwork
2017-12-13 18:56   ` Chris Wilson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171207235625.9135-1-chris@chris-wilson.co.uk \
    --to=chris@chris-wilson.co.uk \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.