[PATCH 38/39] gfp-switch-k

Chris Wilson chris at chris-wilson.co.uk
Sat Jul 14 15:34:43 UTC 2018


---
 drivers/gpu/drm/i915/i915_gem.c               | 10 +++---
 drivers/gpu/drm/i915/i915_gem_context.c       | 32 ++++++++++++++-----
 drivers/gpu/drm/i915/i915_gem_context.h       |  2 +-
 drivers/gpu/drm/i915/i915_gem_evict.c         |  2 +-
 .../gpu/drm/i915/selftests/i915_gem_context.c |  4 +--
 .../gpu/drm/i915/selftests/igt_flush_test.c   |  2 +-
 6 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 47c7b0e4b709..f918d1b1ef88 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3132,7 +3132,7 @@ i915_gem_idle_work_handler(struct work_struct *work)
 	 * idle that implies a round trip through the retire worker).
 	 */
 	mutex_lock(&dev_priv->drm.struct_mutex);
-	i915_gem_switch_to_kernel_context(dev_priv);
+	i915_gem_switch_to_kernel_context(dev_priv, GFP_KERNEL);
 	mutex_unlock(&dev_priv->drm.struct_mutex);
 
 	GEM_TRACE("active_requests=%d (after switch-to-kernel-context)\n",
@@ -4655,7 +4655,7 @@ int i915_gem_suspend(struct drm_i915_private *i915)
 	 * not rely on its state.
 	 */
 	if (!i915_terminally_wedged(&i915->gpu_error)) {
-		ret = i915_gem_switch_to_kernel_context(i915);
+		ret = i915_gem_switch_to_kernel_context(i915, GFP_KERNEL);
 		if (ret)
 			goto err_unlock;
 
@@ -4764,7 +4764,7 @@ void i915_gem_resume(struct drm_i915_private *i915)
 	intel_uc_resume(i915);
 
 	/* Always reload a context for powersaving. */
-	if (i915_gem_switch_to_kernel_context(i915))
+	if (i915_gem_switch_to_kernel_context(i915, GFP_KERNEL))
 		goto err_wedged;
 
 out_unlock:
@@ -4969,7 +4969,7 @@ static int __intel_engines_record_defaults(struct drm_i915_private *i915)
 			goto err_active;
 	}
 
-	err = i915_gem_switch_to_kernel_context(i915);
+	err = i915_gem_switch_to_kernel_context(i915, GFP_KERNEL);
 	if (err)
 		goto err_active;
 
@@ -5037,7 +5037,7 @@ static int __intel_engines_record_defaults(struct drm_i915_private *i915)
 	 * request, ensure we are pointing at the kernel context and
 	 * then remove it.
 	 */
-	if (WARN_ON(i915_gem_switch_to_kernel_context(i915)))
+	if (WARN_ON(i915_gem_switch_to_kernel_context(i915, GFP_KERNEL)))
 		goto out_ctx;
 
 	if (WARN_ON(i915_gem_wait_for_idle(i915,
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 595c6fee754e..261054bf8bb4 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -746,7 +746,8 @@ static bool engine_has_kernel_context_barrier(struct intel_engine_cs *engine)
 	return intel_engine_has_kernel_context(engine);
 }
 
-int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915)
+int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915,
+				      gfp_t gfp)
 {
 	struct intel_engine_cs *engine;
 	enum intel_engine_id id;
@@ -761,6 +762,7 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915)
 	for_each_engine(engine, i915, id) {
 		struct intel_ring *ring;
 		struct i915_request *rq;
+		int err;
 
 		GEM_BUG_ON(!to_intel_context(i915->kernel_context, engine));
 		if (engine_has_kernel_context_barrier(engine))
@@ -768,13 +770,12 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915)
 
 		GEM_TRACE("emit barrier on %s\n", engine->name);
 
-		rq = i915_request_alloc(engine,
-				       	i915->kernel_context,
-				       	GFP_KERNEL);
+		rq = i915_request_alloc(engine, i915->kernel_context, gfp);
 		if (IS_ERR(rq))
 			return PTR_ERR(rq);
 
 		/* Queue this switch after all other activity */
+		err = 0;
 		list_for_each_entry(ring, &i915->gt.active_rings, active_link) {
 			struct i915_request *prev;
 
@@ -789,13 +790,28 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915)
 				  engine->name,
 				  prev->fence.context,
 				  prev->fence.seqno);
-			i915_sw_fence_await_sw_fence_gfp(&rq->submit,
-							 &prev->submit,
-							 I915_FENCE_GFP);
-			i915_timeline_sync_set(rq->timeline, &prev->fence);
+
+			err = i915_sw_fence_await_sw_fence_gfp(&rq->submit,
+							       &prev->submit,
+							       gfp);
+			if (err < 0)
+				break;
+
+			/*
+			 * Ignore the error here. In the worst case, if we fail
+			 * to insert a record of this barrier, we will just
+			 * emit another (redundant) barrier next time with no
+			 * loss of functionality or correctness.
+			 */
+			i915_syncmap_set(&rq->timeline->sync,
+					 prev->fence.context,
+					 prev->fence.seqno,
+					 gfp);
 		}
 
 		i915_request_add(rq);
+		if (err)
+			return err;
 	}
 
 	return 0;
diff --git a/drivers/gpu/drm/i915/i915_gem_context.h b/drivers/gpu/drm/i915/i915_gem_context.h
index 343d228a1eff..4d8c3bba5e64 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.h
+++ b/drivers/gpu/drm/i915/i915_gem_context.h
@@ -332,7 +332,7 @@ int i915_gem_context_open(struct drm_i915_private *i915,
 void i915_gem_context_close(struct drm_file *file);
 
 int i915_switch_context(struct i915_request *rq);
-int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv);
+int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915, gfp_t gfp);
 
 void i915_gem_context_release(struct kref *ctx_ref);
 struct i915_gem_context *
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
index 6a3608398d2a..11742f8701d7 100644
--- a/drivers/gpu/drm/i915/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/i915_gem_evict.c
@@ -63,7 +63,7 @@ static int ggtt_flush(struct drm_i915_private *i915)
 	 * the hopes that we can then remove contexts and the like only
 	 * bound by their active reference.
 	 */
-	err = i915_gem_switch_to_kernel_context(i915);
+	err = i915_gem_switch_to_kernel_context(i915, GFP_KERNEL);
 	if (err)
 		return err;
 
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
index eddad2c28dea..dd0a378f203c 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
@@ -701,7 +701,7 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915,
 		i915_request_add(rq);
 	}
 
-	err = i915_gem_switch_to_kernel_context(i915);
+	err = i915_gem_switch_to_kernel_context(i915, GFP_KERNEL);
 	if (err)
 		return err;
 
@@ -728,7 +728,7 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915,
 		}
 	}
 
-	err = i915_gem_switch_to_kernel_context(i915);
+	err = i915_gem_switch_to_kernel_context(i915, GFP_KERNEL);
 	if (err)
 		return err;
 
diff --git a/drivers/gpu/drm/i915/selftests/igt_flush_test.c b/drivers/gpu/drm/i915/selftests/igt_flush_test.c
index af66e3d4e23a..7dcc6f574636 100644
--- a/drivers/gpu/drm/i915/selftests/igt_flush_test.c
+++ b/drivers/gpu/drm/i915/selftests/igt_flush_test.c
@@ -14,7 +14,7 @@ int igt_flush_test(struct drm_i915_private *i915, unsigned int flags)
 	cond_resched();
 
 	if (flags & I915_WAIT_LOCKED &&
-	    i915_gem_switch_to_kernel_context(i915)) {
+	    i915_gem_switch_to_kernel_context(i915, GFP_KERNEL)) {
 		pr_err("Failed to switch back to kernel context; declaring wedged\n");
 		i915_gem_set_wedged(i915);
 	}
-- 
2.18.0



More information about the Intel-gfx-trybot mailing list