drm/i915: Stop putting GGTT VMA at the head of the list
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>
Wed, 3 Dec 2014 14:59:24 +0000 (14:59 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 4 Dec 2014 10:51:36 +0000 (11:51 +0100)
Multiple GGTT VMAs per object will be introduced in the near future which will
make it impossible to guarantee normal GGTT view is at the head of the list.

Purpose of this patch is to break this assumption straight away so any
potential hidden assumptions in the code base can be bisected to this
simple patch.

For: VIZ-4544
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Suggested-by: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_gtt.c

index 9d362d320d824cddac9c33b5ce39905017d60ac2..c1c11418231bd0a80722dac8d8cf36c6f2c6f477 100644 (file)
@@ -5303,11 +5303,13 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
 
 struct i915_vma *i915_gem_obj_to_ggtt(struct drm_i915_gem_object *obj)
 {
+       struct i915_address_space *ggtt = i915_obj_to_ggtt(obj);
        struct i915_vma *vma;
 
-       vma = list_first_entry(&obj->vma_list, typeof(*vma), vma_link);
-       if (vma->vm != i915_obj_to_ggtt(obj))
-               return NULL;
+       list_for_each_entry(vma, &obj->vma_list, vma_link) {
+               if (vma->vm == ggtt)
+                       return vma;
+       }
 
-       return vma;
+       return NULL;
 }
index 171f6eafdeee3093d21354b411debebec994378b..ac03a382000b62cf730d3ff1924d53439a8b88ab 100644 (file)
@@ -2202,13 +2202,9 @@ static struct i915_vma *__i915_gem_vma_create(struct drm_i915_gem_object *obj,
                BUG();
        }
 
-       /* Keep GGTT vmas first to make debug easier */
-       if (i915_is_ggtt(vm))
-               list_add(&vma->vma_link, &obj->vma_list);
-       else {
-               list_add_tail(&vma->vma_link, &obj->vma_list);
+       list_add_tail(&vma->vma_link, &obj->vma_list);
+       if (!i915_is_ggtt(vm))
                i915_ppgtt_get(i915_vm_to_ppgtt(vm));
-       }
 
        return vma;
 }