From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> This allows trivial (non-iterating) i915_gem_obj_is_pinned implementation which in turns prevents i915_gem_madvise_ioctl showing up in profiles in benchmarks like SynMark2/OglDrvCtx. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_drv.h | 9 ++++++++- drivers/gpu/drm/i915/i915_gem.c | 15 +++++---------- drivers/gpu/drm/i915/i915_gem_execbuffer.c | 4 +++- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 6f1e0f127c0a..589256e2ebe9 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2104,6 +2104,9 @@ struct drm_i915_gem_object { /** List of VMAs backed by this object */ struct list_head vma_list; + /** Aggregate pin count of all VMAs backed by this object. */ + unsigned int vma_pin_count; + /** Stolen memory for this object, instead of being backed by shmem. */ struct drm_mm_node *stolen; struct list_head global_list; @@ -3236,7 +3239,11 @@ i915_gem_obj_to_ggtt(struct drm_i915_gem_object *obj) { return i915_gem_obj_to_ggtt_view(obj, &i915_ggtt_view_normal); } -bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj); + +static inline bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj) +{ + return obj->vma_pin_count > 0; +} /* Some GGTT VM helpers */ static inline struct i915_hw_ppgtt * diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 261a3ef72828..0549dea683e1 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -4311,6 +4311,8 @@ i915_gem_object_do_pin(struct drm_i915_gem_object *obj, } vma->pin_count++; + obj->vma_pin_count++; + return 0; } @@ -4351,6 +4353,7 @@ i915_gem_object_ggtt_unpin_view(struct drm_i915_gem_object *obj, WARN_ON(!i915_gem_obj_ggtt_bound_view(obj, view)); --vma->pin_count; + --obj->vma_pin_count; } int @@ -4583,6 +4586,8 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj) list_for_each_entry_safe(vma, next, &obj->vma_list, obj_link) { int ret; + GEM_BUG_ON(obj->vma_pin_count < vma->pin_count); + obj->vma_pin_count -= vma->pin_count; vma->pin_count = 0; ret = i915_vma_unbind(vma); if (WARN_ON(ret == -ERESTARTSYS)) { @@ -5326,16 +5331,6 @@ unsigned long i915_gem_obj_size(struct drm_i915_gem_object *o, return 0; } -bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj) -{ - struct i915_vma *vma; - list_for_each_entry(vma, &obj->vma_list, obj_link) - if (vma->pin_count > 0) - return true; - - return false; -} - /* Like i915_gem_object_get_page(), but mark the returned page dirty */ struct page * i915_gem_object_get_dirty_page(struct drm_i915_gem_object *obj, int n) diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 6f4f2a6cdf93..b4c787763955 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -218,8 +218,10 @@ i915_gem_execbuffer_unreserve_vma(struct i915_vma *vma) if (entry->flags & __EXEC_OBJECT_HAS_FENCE) i915_gem_object_unpin_fence(obj); - if (entry->flags & __EXEC_OBJECT_HAS_PIN) + if (entry->flags & __EXEC_OBJECT_HAS_PIN) { vma->pin_count--; + obj->vma_pin_count--; + } entry->flags &= ~(__EXEC_OBJECT_HAS_FENCE | __EXEC_OBJECT_HAS_PIN); } -- 1.9.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx