]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/gpu/drm/i915/i915_gem_evict.c
drm/i915: use correct node for handling cache domain eviction
[mirror_ubuntu-bionic-kernel.git] / drivers / gpu / drm / i915 / i915_gem_evict.c
index c181b1bb3d2c9e72addb040ee8a0d5a4b52f06c9..2da3a94fc9f391faf2b3ea4ae2b0f751b8643822 100644 (file)
@@ -258,6 +258,9 @@ int i915_gem_evict_for_node(struct i915_address_space *vm,
        int ret = 0;
 
        lockdep_assert_held(&vm->i915->drm.struct_mutex);
+       GEM_BUG_ON(!IS_ALIGNED(start, I915_GTT_PAGE_SIZE));
+       GEM_BUG_ON(!IS_ALIGNED(end, I915_GTT_PAGE_SIZE));
+
        trace_i915_gem_evict_node(vm, target, flags);
 
        /* Retire before we search the active list. Although we have
@@ -271,11 +274,13 @@ int i915_gem_evict_for_node(struct i915_address_space *vm,
        check_color = vm->mm.color_adjust;
        if (check_color) {
                /* Expand search to cover neighbouring guard pages (or lack!) */
-               if (start > vm->start)
+               if (start)
                        start -= I915_GTT_PAGE_SIZE;
-               if (end < vm->start + vm->total)
-                       end += I915_GTT_PAGE_SIZE;
+
+               /* Always look at the page afterwards to avoid the end-of-GTT */
+               end += I915_GTT_PAGE_SIZE;
        }
+       GEM_BUG_ON(start >= end);
 
        drm_mm_for_each_node_in_range(node, &vm->mm, start, end) {
                /* If we find any non-objects (!vma), we cannot evict them */
@@ -284,6 +289,7 @@ int i915_gem_evict_for_node(struct i915_address_space *vm,
                        break;
                }
 
+               GEM_BUG_ON(!node->allocated);
                vma = container_of(node, typeof(*vma), node);
 
                /* If we are using coloring to insert guard pages between
@@ -293,12 +299,12 @@ int i915_gem_evict_for_node(struct i915_address_space *vm,
                 * those as well to make room for our guard pages.
                 */
                if (check_color) {
-                       if (vma->node.start + vma->node.size == node->start) {
-                               if (vma->node.color == node->color)
+                       if (node->start + node->size == target->start) {
+                               if (node->color == target->color)
                                        continue;
                        }
-                       if (vma->node.start == node->start + node->size) {
-                               if (vma->node.color == node->color)
+                       if (node->start == target->start + target->size) {
+                               if (node->color == target->color)
                                        continue;
                        }
                }
@@ -387,3 +393,7 @@ int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle)
 
        return 0;
 }
+
+#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
+#include "selftests/i915_gem_evict.c"
+#endif