drm/i915: Use same test for eviction and submitting kernel context
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 24 Oct 2017 22:08:55 +0000 (23:08 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 25 Oct 2017 11:13:03 +0000 (12:13 +0100)
During evict, we wish to idle the GPU if we see that the GGTT is full.
However, our test for idle in i915_gem_evict_something() and in
i915_gem_switch_to_kernel_context() do not match leading to
disappointment - we never believe that we are idle and keep trying to
flush the GGTT ad infinitum.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103438
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171024220855.30155-2-chris@chris-wilson.co.uk
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
drivers/gpu/drm/i915/i915_gem_context.c
drivers/gpu/drm/i915/i915_gem_evict.c
drivers/gpu/drm/i915/intel_engine_cs.c
drivers/gpu/drm/i915/intel_ringbuffer.h

index 5bf96a258509989e26b1ea4397ad8f8e7ffd9d81..4f26f80b1b3eb7dbec415800e7c61956ebc09929 100644 (file)
@@ -897,7 +897,7 @@ int i915_switch_context(struct drm_i915_gem_request *req)
        return do_rcs_switch(req);
 }
 
-static bool engine_has_kernel_context(struct intel_engine_cs *engine)
+static bool engine_has_idle_kernel_context(struct intel_engine_cs *engine)
 {
        struct i915_gem_timeline *timeline;
 
@@ -913,8 +913,7 @@ static bool engine_has_kernel_context(struct intel_engine_cs *engine)
                        return false;
        }
 
-       return (!engine->last_retired_context ||
-               i915_gem_context_is_kernel(engine->last_retired_context));
+       return intel_engine_has_kernel_context(engine);
 }
 
 int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv)
@@ -931,7 +930,7 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv)
                struct drm_i915_gem_request *req;
                int ret;
 
-               if (engine_has_kernel_context(engine))
+               if (engine_has_idle_kernel_context(engine))
                        continue;
 
                req = i915_gem_request_alloc(engine, dev_priv->kernel_context);
index a6b769994d8df6cbdc834a608162fe320c7dd830..60ca4f05ae94a2f73c3f2b8dcf7a63f9b9bbf8f7 100644 (file)
@@ -46,7 +46,7 @@ static bool ggtt_is_idle(struct drm_i915_private *i915)
               return false;
 
        for_each_engine(engine, i915, id) {
-              if (engine->last_retired_context != i915->kernel_context)
+              if (!intel_engine_has_kernel_context(engine))
                       return false;
        }
 
@@ -73,6 +73,7 @@ static int ggtt_flush(struct drm_i915_private *i915)
        if (err)
                return err;
 
+       GEM_BUG_ON(!ggtt_is_idle(i915));
        return 0;
 }
 
index ab5bf4e2e28e21f3daa7072a37cb6895aba8233c..f6cdc50d423710b2a480d03c59ef67a3718c763f 100644 (file)
@@ -1585,6 +1585,12 @@ bool intel_engines_are_idle(struct drm_i915_private *dev_priv)
        return true;
 }
 
+bool intel_engine_has_kernel_context(const struct intel_engine_cs *engine)
+{
+       return (!engine->last_retired_context ||
+               i915_gem_context_is_kernel(engine->last_retired_context));
+}
+
 void intel_engines_reset_default_submission(struct drm_i915_private *i915)
 {
        struct intel_engine_cs *engine;
index 6a42ed618a28ce1f47b2aeca7263cb9f561a1a86..a2589aa891639db6d46cb6126ebb58cabb1fd35b 100644 (file)
@@ -866,6 +866,8 @@ static inline u32 *gen8_emit_pipe_control(u32 *batch, u32 flags, u32 offset)
 bool intel_engine_is_idle(struct intel_engine_cs *engine);
 bool intel_engines_are_idle(struct drm_i915_private *dev_priv);
 
+bool intel_engine_has_kernel_context(const struct intel_engine_cs *engine);
+
 void intel_engines_mark_idle(struct drm_i915_private *i915);
 void intel_engines_reset_default_submission(struct drm_i915_private *i915);