On Thu, Dec 07, 2017 at 04:27:17PM +0000, Chris Wilson wrote:
> 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.
> 
> Suggested-by: Joonas Lahtinen <joonas.lahti...@linux.intel.com>
> Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahti...@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_debugfs.c    |  4 ++--
>  drivers/gpu/drm/i915/i915_gem.c        | 18 ++++--------------
>  drivers/gpu/drm/i915/i915_gem_gtt.c    |  5 +----
>  drivers/gpu/drm/i915/i915_gem_tiling.c | 10 ++--------
>  drivers/gpu/drm/i915/i915_vma.h        | 14 +++++++++++++-
>  5 files changed, 22 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
> b/drivers/gpu/drm/i915/i915_debugfs.c
> index 28294470ae31..7b41a1799a03 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -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;
>       }
>  
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 67dc11effc8e..c7b5db78fbb4 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -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;
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
> b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 1faea9a17b5a..d701b79b6319 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -3623,10 +3623,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;
>  
> diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c 
> b/drivers/gpu/drm/i915/i915_gem_tiling.c
> index b85d7ebd9bee..d9dc9df523b5 100644
> --- a/drivers/gpu/drm/i915/i915_gem_tiling.c
> +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
> @@ -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 =
> diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h
> index f636243eb8f7..d58da80c0dd2 100644
> --- a/drivers/gpu/drm/i915/i915_vma.h
> +++ b/drivers/gpu/drm/i915/i915_vma.h
> @@ -408,5 +408,17 @@ i915_vma_unpin_fence(struct i915_vma *vma)
>               __i915_vma_unpin_fence(vma);
>  }
>  
> -#endif
> +/**
> + * 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)              \
> +             if (!i915_vma_is_ggtt(vma)) break; else

Definitely like that we document this assumption a bit better and
encapsulate it.

Reviewed-by: Daniel Vetter <daniel.vet...@ffwll.ch>

>  
> +#endif
> -- 
> 2.15.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to