[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