@@ -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 *
@@ -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)
@@ -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);
}