drm/i915: Only switch to default context when evicting from GGTT
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Jun 2016 13:55:58 +0000 (14:55 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Jun 2016 14:03:32 +0000 (15:03 +0100)
The contexts only pin space within the global GTT. Therefore forcing the
switch to the perma-pinned kernel context only has an effect when trying
to evict from and find room within the global GTT. We can then restrict
the switch to only when operating on the default context. This is mostly
a no-op as full-ppgtt only exists with execlists at present which skips
the context switch anyway.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1466776558-21516-7-git-send-email-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_evict.c

index 5741b58d186c5aa86e5feaeb807c6c031f94b589..3c1280ec7ff648979ea96a17325a5aa6924e688d 100644 (file)
@@ -183,9 +183,11 @@ none:
        if (pass++ == 0) {
                struct drm_i915_private *dev_priv = to_i915(dev);
 
-               ret = switch_to_pinned_context(dev_priv);
-               if (ret)
-                       return ret;
+               if (i915_is_ggtt(vm)) {
+                       ret = switch_to_pinned_context(dev_priv);
+                       if (ret)
+                               return ret;
+               }
 
                ret = i915_gem_wait_for_idle(dev_priv);
                if (ret)
@@ -300,9 +302,11 @@ int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle)
        if (do_idle) {
                struct drm_i915_private *dev_priv = to_i915(vm->dev);
 
-               ret = switch_to_pinned_context(dev_priv);
-               if (ret)
-                       return ret;
+               if (i915_is_ggtt(vm)) {
+                       ret = switch_to_pinned_context(dev_priv);
+                       if (ret)
+                               return ret;
+               }
 
                ret = i915_gem_wait_for_idle(dev_priv);
                if (ret)