]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/i915: Refactor common list iteration over GGTT vma
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 7 Dec 2017 21:14:07 +0000 (21:14 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 7 Dec 2017 23:26:55 +0000 (23:26 +0000)
In quite a few places, we have a list iteration over the vma on an
object that only want to inspect GGTT vma. By construction, these are
placed at the start of the list, so we have copied that knowledge into
many callsites. Pull that knowledge back to i915_vma.h and provide a
for_each_ggtt_vma() to tidy up the code.

v2: Add a backreference from vma_create() to remind ourselves why we put
ggtt vma at the head of the obj->vma_list (and ppgtt vma at the tail).
v3: Fixup s/vma/V/

Suggested-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20171207211407.31549-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_tiling.c
drivers/gpu/drm/i915/i915_vma.c
drivers/gpu/drm/i915/i915_vma.h

index 28294470ae31f2275a6b984810d6ebb206d5a6e0..7b41a1799a03a4882f03f1e9ae0ca486914275ca 100644 (file)
@@ -111,8 +111,8 @@ static u64 i915_gem_obj_total_ggtt_size(struct drm_i915_gem_object *obj)
        u64 size = 0;
        struct i915_vma *vma;
 
-       list_for_each_entry(vma, &obj->vma_list, obj_link) {
-               if (i915_vma_is_ggtt(vma) && drm_mm_node_allocated(&vma->node))
+       for_each_ggtt_vma(vma, obj) {
+               if (drm_mm_node_allocated(&vma->node))
                        size += vma->node.size;
        }
 
index 67dc11effc8e55c31fcc80960582cf6da85aacca..c7b5db78fbb48d5efbb96b16a229637d75e3a1d7 100644 (file)
@@ -714,10 +714,7 @@ flush_write_domain(struct drm_i915_gem_object *obj, unsigned int flush_domains)
                intel_fb_obj_flush(obj,
                                   fb_write_origin(obj, I915_GEM_DOMAIN_GTT));
 
-               list_for_each_entry(vma, &obj->vma_list, obj_link) {
-                       if (!i915_vma_is_ggtt(vma))
-                               break;
-
+               for_each_ggtt_vma(vma, obj) {
                        if (vma->iomap)
                                continue;
 
@@ -1569,10 +1566,7 @@ static void i915_gem_object_bump_inactive_ggtt(struct drm_i915_gem_object *obj)
 
        GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj));
 
-       list_for_each_entry(vma, &obj->vma_list, obj_link) {
-               if (!i915_vma_is_ggtt(vma))
-                       break;
-
+       for_each_ggtt_vma(vma, obj) {
                if (i915_vma_is_active(vma))
                        continue;
 
@@ -2051,12 +2045,8 @@ static void __i915_gem_object_release_mmap(struct drm_i915_gem_object *obj)
        drm_vma_node_unmap(&obj->base.vma_node,
                           obj->base.dev->anon_inode->i_mapping);
 
-       list_for_each_entry(vma, &obj->vma_list, obj_link) {
-               if (!i915_vma_is_ggtt(vma))
-                       break;
-
+       for_each_ggtt_vma(vma, obj)
                i915_vma_unset_userfault(vma);
-       }
 }
 
 /**
@@ -3822,7 +3812,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
                         * dropped the fence as all snoopable access is
                         * supposed to be linear.
                         */
-                       list_for_each_entry(vma, &obj->vma_list, obj_link) {
+                       for_each_ggtt_vma(vma, obj) {
                                ret = i915_vma_put_fence(vma);
                                if (ret)
                                        return ret;
index 86fbd67388f311d9976eb4e47f15e6042b463ee9..c4bb02ecd2175b0ed17593ea71558a31eb2eff00 100644 (file)
@@ -3620,10 +3620,7 @@ void i915_gem_restore_gtt_mappings(struct drm_i915_private *dev_priv)
                bool ggtt_bound = false;
                struct i915_vma *vma;
 
-               list_for_each_entry(vma, &obj->vma_list, obj_link) {
-                       if (vma->vm != &ggtt->base)
-                               continue;
-
+               for_each_ggtt_vma(vma, obj) {
                        if (!i915_vma_unbind(vma))
                                continue;
 
index b85d7ebd9beea5beeb89115676ce97787c1a7960..d9dc9df523b58e9a8645838e9c2ffa2080c54d61 100644 (file)
@@ -205,10 +205,7 @@ i915_gem_object_fence_prepare(struct drm_i915_gem_object *obj,
        if (tiling_mode == I915_TILING_NONE)
                return 0;
 
-       list_for_each_entry(vma, &obj->vma_list, obj_link) {
-               if (!i915_vma_is_ggtt(vma))
-                       break;
-
+       for_each_ggtt_vma(vma, obj) {
                if (i915_vma_fence_prepare(vma, tiling_mode, stride))
                        continue;
 
@@ -285,10 +282,7 @@ i915_gem_object_set_tiling(struct drm_i915_gem_object *obj,
        }
        mutex_unlock(&obj->mm.lock);
 
-       list_for_each_entry(vma, &obj->vma_list, obj_link) {
-               if (!i915_vma_is_ggtt(vma))
-                       break;
-
+       for_each_ggtt_vma(vma, obj) {
                vma->fence_size =
                        i915_gem_fence_size(i915, vma->size, tiling, stride);
                vma->fence_alignment =
index 0ebd75693505ea3b39ecef1e38d987f6e3c8dcc1..92c11e70fea48c4be65aabc1d0ef69ab7469e666 100644 (file)
@@ -142,6 +142,12 @@ vma_create(struct drm_i915_gem_object *obj,
                                                                i915_gem_object_get_stride(obj));
                GEM_BUG_ON(!is_power_of_2(vma->fence_alignment));
 
+               /*
+                * We put the GGTT vma at the start of the vma-list, followed
+                * by the ppGGTT vma. This allows us to break early when
+                * iterating over only the GGTT vma for an object, see
+                * for_each_ggtt_vma()
+                */
                vma->flags |= I915_VMA_GGTT;
                list_add(&vma->obj_link, &obj->vma_list);
        } else {
index f636243eb8f72773a3551bf989ce0f90a44489a4..fd5b84904f7cb8b902819c14069945b3f147d148 100644 (file)
@@ -408,5 +408,19 @@ i915_vma_unpin_fence(struct i915_vma *vma)
                __i915_vma_unpin_fence(vma);
 }
 
-#endif
+#define for_each_until(cond) if (cond) break; else
+
+/**
+ * for_each_ggtt_vma - Iterate over the GGTT VMA belonging to an object.
+ * @V: the #i915_vma iterator
+ * @OBJ: the #drm_i915_gem_object
+ *
+ * GGTT VMA are placed at the being of the object's vma_list, see
+ * vma_create(), so we can stop our walk as soon as we see a ppgtt VMA,
+ * or the list is empty ofc.
+ */
+#define for_each_ggtt_vma(V, OBJ) \
+       list_for_each_entry(V, &(OBJ)->vma_list, obj_link)              \
+               for_each_until(!i915_vma_is_ggtt(V))
 
+#endif