[PATCH 47/48] gfp-switch-k
Chris Wilson
chris at chris-wilson.co.uk
Tue Jul 3 09:52:54 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 bcdb145ece55..ad8136a859e4 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3120,7 +3120,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",
@@ -4640,7 +4640,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;
@@ -4748,7 +4748,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:
@@ -4949,7 +4949,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;
@@ -5015,7 +5015,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, I915_WAIT_LOCKED)))
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index c8a30bfa7c1e..d6a350269684 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -739,7 +739,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;
@@ -754,6 +755,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))
@@ -761,13 +763,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;
@@ -782,13 +783,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 8bc6fc66cea2..23ee248a1a65 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 a4991a88134a..1269b4a3dacb 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
@@ -690,7 +690,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;
@@ -715,7 +715,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 0d06f559243f..0dcc036d2b83 100644
--- a/drivers/gpu/drm/i915/selftests/igt_flush_test.c
+++ b/drivers/gpu/drm/i915/selftests/igt_flush_test.c
@@ -58,7 +58,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