aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorBen Widawsky <benjamin.widawsky@intel.com>2013-12-06 17:10:55 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-12-18 09:27:49 -0500
commitd7f46fc4e7323887494db13f063a8e59861fefb0 (patch)
tree7b58d50a01f965ef5f814de57ece105b77cbeb10 /drivers/gpu/drm/i915
parent685987c6915222730f45141a89f1cd87fb092e9a (diff)
drm/i915: Make pin count per VMA
Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c14
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h34
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c49
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c14
-rw-r--r--drivers/gpu/drm/i915/i915_gem_evict.c5
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c6
-rw-r--r--drivers/gpu/drm/i915/i915_gem_tiling.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gpu_error.c6
-rw-r--r--drivers/gpu/drm/i915/intel_fbdev.c4
-rw-r--r--drivers/gpu/drm/i915/intel_overlay.c8
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c6
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c12
12 files changed, 90 insertions, 70 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 13accf795548..4c610eeb5459 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -100,7 +100,7 @@ static const char *get_pin_flag(struct drm_i915_gem_object *obj)
100{ 100{
101 if (obj->user_pin_count > 0) 101 if (obj->user_pin_count > 0)
102 return "P"; 102 return "P";
103 else if (obj->pin_count > 0) 103 else if (i915_gem_obj_is_pinned(obj))
104 return "p"; 104 return "p";
105 else 105 else
106 return " "; 106 return " ";
@@ -125,6 +125,8 @@ static void
125describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) 125describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
126{ 126{
127 struct i915_vma *vma; 127 struct i915_vma *vma;
128 int pin_count = 0;
129
128 seq_printf(m, "%pK: %s%s%s %8zdKiB %02x %02x %u %u %u%s%s%s", 130 seq_printf(m, "%pK: %s%s%s %8zdKiB %02x %02x %u %u %u%s%s%s",
129 &obj->base, 131 &obj->base,
130 get_pin_flag(obj), 132 get_pin_flag(obj),
@@ -141,8 +143,10 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
141 obj->madv == I915_MADV_DONTNEED ? " purgeable" : ""); 143 obj->madv == I915_MADV_DONTNEED ? " purgeable" : "");
142 if (obj->base.name) 144 if (obj->base.name)
143 seq_printf(m, " (name: %d)", obj->base.name); 145 seq_printf(m, " (name: %d)", obj->base.name);
144 if (obj->pin_count) 146 list_for_each_entry(vma, &obj->vma_list, vma_link)
145 seq_printf(m, " (pinned x %d)", obj->pin_count); 147 if (vma->pin_count > 0)
148 pin_count++;
149 seq_printf(m, " (pinned x %d)", pin_count);
146 if (obj->pin_display) 150 if (obj->pin_display)
147 seq_printf(m, " (display)"); 151 seq_printf(m, " (display)");
148 if (obj->fence_reg != I915_FENCE_REG_NONE) 152 if (obj->fence_reg != I915_FENCE_REG_NONE)
@@ -439,7 +443,7 @@ static int i915_gem_gtt_info(struct seq_file *m, void *data)
439 443
440 total_obj_size = total_gtt_size = count = 0; 444 total_obj_size = total_gtt_size = count = 0;
441 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) { 445 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
442 if (list == PINNED_LIST && obj->pin_count == 0) 446 if (list == PINNED_LIST && !i915_gem_obj_is_pinned(obj))
443 continue; 447 continue;
444 448
445 seq_puts(m, " "); 449 seq_puts(m, " ");
@@ -2843,7 +2847,7 @@ i915_drop_caches_set(void *data, u64 val)
2843 list_for_each_entry(vm, &dev_priv->vm_list, global_link) { 2847 list_for_each_entry(vm, &dev_priv->vm_list, global_link) {
2844 list_for_each_entry_safe(vma, x, &vm->inactive_list, 2848 list_for_each_entry_safe(vma, x, &vm->inactive_list,
2845 mm_list) { 2849 mm_list) {
2846 if (vma->obj->pin_count) 2850 if (vma->pin_count)
2847 continue; 2851 continue;
2848 2852
2849 ret = i915_vma_unbind(vma); 2853 ret = i915_vma_unbind(vma);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 780f815b6c9f..bf022c4a5773 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -651,6 +651,19 @@ struct i915_vma {
651 unsigned long exec_handle; 651 unsigned long exec_handle;
652 struct drm_i915_gem_exec_object2 *exec_entry; 652 struct drm_i915_gem_exec_object2 *exec_entry;
653 653
654 /**
655 * How many users have pinned this object in GTT space. The following
656 * users can each hold at most one reference: pwrite/pread, pin_ioctl
657 * (via user_pin_count), execbuffer (objects are not allowed multiple
658 * times for the same batchbuffer), and the framebuffer code. When
659 * switching/pageflipping, the framebuffer code has at most two buffers
660 * pinned per crtc.
661 *
662 * In the worst case this is 1 + 1 + 1 + 2*2 = 7. That would fit into 3
663 * bits with absolutely no headroom. So use 4 bits.
664 */
665 unsigned int pin_count:4;
666#define DRM_I915_GEM_OBJECT_MAX_PIN_COUNT 0xf
654}; 667};
655 668
656struct i915_ctx_hang_stats { 669struct i915_ctx_hang_stats {
@@ -1617,18 +1630,6 @@ struct drm_i915_gem_object {
1617 */ 1630 */
1618 unsigned int fence_dirty:1; 1631 unsigned int fence_dirty:1;
1619 1632
1620 /** How many users have pinned this object in GTT space. The following
1621 * users can each hold at most one reference: pwrite/pread, pin_ioctl
1622 * (via user_pin_count), execbuffer (objects are not allowed multiple
1623 * times for the same batchbuffer), and the framebuffer code. When
1624 * switching/pageflipping, the framebuffer code has at most two buffers
1625 * pinned per crtc.
1626 *
1627 * In the worst case this is 1 + 1 + 1 + 2*2 = 7. That would fit into 3
1628 * bits with absolutely no headroom. So use 4 bits. */
1629 unsigned int pin_count:4;
1630#define DRM_I915_GEM_OBJECT_MAX_PIN_COUNT 0xf
1631
1632 /** 1633 /**
1633 * Is the object at the current location in the gtt mappable and 1634 * Is the object at the current location in the gtt mappable and
1634 * fenceable? Used to avoid costly recalculations. 1635 * fenceable? Used to avoid costly recalculations.
@@ -2005,7 +2006,7 @@ int __must_check i915_gem_object_pin(struct drm_i915_gem_object *obj,
2005 uint32_t alignment, 2006 uint32_t alignment,
2006 bool map_and_fenceable, 2007 bool map_and_fenceable,
2007 bool nonblocking); 2008 bool nonblocking);
2008void i915_gem_object_unpin(struct drm_i915_gem_object *obj); 2009void i915_gem_object_ggtt_unpin(struct drm_i915_gem_object *obj);
2009int __must_check i915_vma_unbind(struct i915_vma *vma); 2010int __must_check i915_vma_unbind(struct i915_vma *vma);
2010int __must_check i915_gem_object_ggtt_unbind(struct drm_i915_gem_object *obj); 2011int __must_check i915_gem_object_ggtt_unbind(struct drm_i915_gem_object *obj);
2011int i915_gem_object_put_pages(struct drm_i915_gem_object *obj); 2012int i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
@@ -2168,6 +2169,13 @@ i915_gem_obj_lookup_or_create_vma(struct drm_i915_gem_object *obj,
2168 struct i915_address_space *vm); 2169 struct i915_address_space *vm);
2169 2170
2170struct i915_vma *i915_gem_obj_to_ggtt(struct drm_i915_gem_object *obj); 2171struct i915_vma *i915_gem_obj_to_ggtt(struct drm_i915_gem_object *obj);
2172static inline bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj) {
2173 struct i915_vma *vma;
2174 list_for_each_entry(vma, &obj->vma_list, vma_link)
2175 if (vma->pin_count > 0)
2176 return true;
2177 return false;
2178}
2171 2179
2172/* Some GGTT VM helpers */ 2180/* Some GGTT VM helpers */
2173#define obj_to_ggtt(obj) \ 2181#define obj_to_ggtt(obj) \
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index d8981ec9fd3b..6dc96bceed19 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -204,7 +204,7 @@ i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
204 pinned = 0; 204 pinned = 0;
205 mutex_lock(&dev->struct_mutex); 205 mutex_lock(&dev->struct_mutex);
206 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) 206 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list)
207 if (obj->pin_count) 207 if (i915_gem_obj_is_pinned(obj))
208 pinned += i915_gem_obj_ggtt_size(obj); 208 pinned += i915_gem_obj_ggtt_size(obj);
209 mutex_unlock(&dev->struct_mutex); 209 mutex_unlock(&dev->struct_mutex);
210 210
@@ -651,7 +651,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
651 } 651 }
652 652
653out_unpin: 653out_unpin:
654 i915_gem_object_unpin(obj); 654 i915_gem_object_ggtt_unpin(obj);
655out: 655out:
656 return ret; 656 return ret;
657} 657}
@@ -1418,7 +1418,7 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1418 /* Finally, remap it using the new GTT offset */ 1418 /* Finally, remap it using the new GTT offset */
1419 ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn); 1419 ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
1420unpin: 1420unpin:
1421 i915_gem_object_unpin(obj); 1421 i915_gem_object_ggtt_unpin(obj);
1422unlock: 1422unlock:
1423 mutex_unlock(&dev->struct_mutex); 1423 mutex_unlock(&dev->struct_mutex);
1424out: 1424out:
@@ -2721,7 +2721,7 @@ int i915_vma_unbind(struct i915_vma *vma)
2721 return 0; 2721 return 0;
2722 } 2722 }
2723 2723
2724 if (obj->pin_count) 2724 if (vma->pin_count)
2725 return -EBUSY; 2725 return -EBUSY;
2726 2726
2727 BUG_ON(obj->pages == NULL); 2727 BUG_ON(obj->pages == NULL);
@@ -2785,7 +2785,7 @@ i915_gem_object_ggtt_unbind(struct drm_i915_gem_object *obj)
2785 if (!i915_gem_obj_ggtt_bound(obj)) 2785 if (!i915_gem_obj_ggtt_bound(obj))
2786 return 0; 2786 return 0;
2787 2787
2788 if (obj->pin_count) 2788 if (i915_gem_obj_to_ggtt(obj)->pin_count)
2789 return -EBUSY; 2789 return -EBUSY;
2790 2790
2791 BUG_ON(obj->pages == NULL); 2791 BUG_ON(obj->pages == NULL);
@@ -3486,7 +3486,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
3486 if (obj->cache_level == cache_level) 3486 if (obj->cache_level == cache_level)
3487 return 0; 3487 return 0;
3488 3488
3489 if (obj->pin_count) { 3489 if (i915_gem_obj_is_pinned(obj)) {
3490 DRM_DEBUG("can not change the cache level of pinned objects\n"); 3490 DRM_DEBUG("can not change the cache level of pinned objects\n");
3491 return -EBUSY; 3491 return -EBUSY;
3492 } 3492 }
@@ -3646,7 +3646,7 @@ static bool is_pin_display(struct drm_i915_gem_object *obj)
3646 * subtracting the potential reference by the user, any pin_count 3646 * subtracting the potential reference by the user, any pin_count
3647 * remains, it must be due to another use by the display engine. 3647 * remains, it must be due to another use by the display engine.
3648 */ 3648 */
3649 return obj->pin_count - !!obj->user_pin_count; 3649 return i915_gem_obj_to_ggtt(obj)->pin_count - !!obj->user_pin_count;
3650} 3650}
3651 3651
3652/* 3652/*
@@ -3720,7 +3720,7 @@ err_unpin_display:
3720void 3720void
3721i915_gem_object_unpin_from_display_plane(struct drm_i915_gem_object *obj) 3721i915_gem_object_unpin_from_display_plane(struct drm_i915_gem_object *obj)
3722{ 3722{
3723 i915_gem_object_unpin(obj); 3723 i915_gem_object_ggtt_unpin(obj);
3724 obj->pin_display = is_pin_display(obj); 3724 obj->pin_display = is_pin_display(obj);
3725} 3725}
3726 3726
@@ -3853,18 +3853,18 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj,
3853 struct i915_vma *vma; 3853 struct i915_vma *vma;
3854 int ret; 3854 int ret;
3855 3855
3856 if (WARN_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT))
3857 return -EBUSY;
3858
3859 WARN_ON(map_and_fenceable && !i915_is_ggtt(vm)); 3856 WARN_ON(map_and_fenceable && !i915_is_ggtt(vm));
3860 3857
3861 vma = i915_gem_obj_to_vma(obj, vm); 3858 vma = i915_gem_obj_to_vma(obj, vm);
3862 3859
3863 if (vma) { 3860 if (vma) {
3861 if (WARN_ON(vma->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT))
3862 return -EBUSY;
3863
3864 if ((alignment && 3864 if ((alignment &&
3865 vma->node.start & (alignment - 1)) || 3865 vma->node.start & (alignment - 1)) ||
3866 (map_and_fenceable && !obj->map_and_fenceable)) { 3866 (map_and_fenceable && !obj->map_and_fenceable)) {
3867 WARN(obj->pin_count, 3867 WARN(vma->pin_count,
3868 "bo is already pinned with incorrect alignment:" 3868 "bo is already pinned with incorrect alignment:"
3869 " offset=%lx, req.alignment=%x, req.map_and_fenceable=%d," 3869 " offset=%lx, req.alignment=%x, req.map_and_fenceable=%d,"
3870 " obj->map_and_fenceable=%d\n", 3870 " obj->map_and_fenceable=%d\n",
@@ -3893,19 +3893,22 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj,
3893 if (!obj->has_global_gtt_mapping && map_and_fenceable) 3893 if (!obj->has_global_gtt_mapping && map_and_fenceable)
3894 i915_gem_gtt_bind_object(obj, obj->cache_level); 3894 i915_gem_gtt_bind_object(obj, obj->cache_level);
3895 3895
3896 obj->pin_count++; 3896 i915_gem_obj_to_vma(obj, vm)->pin_count++;
3897 obj->pin_mappable |= map_and_fenceable; 3897 obj->pin_mappable |= map_and_fenceable;
3898 3898
3899 return 0; 3899 return 0;
3900} 3900}
3901 3901
3902void 3902void
3903i915_gem_object_unpin(struct drm_i915_gem_object *obj) 3903i915_gem_object_ggtt_unpin(struct drm_i915_gem_object *obj)
3904{ 3904{
3905 BUG_ON(obj->pin_count == 0); 3905 struct i915_vma *vma = i915_gem_obj_to_ggtt(obj);
3906 BUG_ON(!i915_gem_obj_bound_any(obj));
3907 3906
3908 if (--obj->pin_count == 0) 3907 BUG_ON(!vma);
3908 BUG_ON(vma->pin_count == 0);
3909 BUG_ON(!i915_gem_obj_ggtt_bound(obj));
3910
3911 if (--vma->pin_count == 0)
3909 obj->pin_mappable = false; 3912 obj->pin_mappable = false;
3910} 3913}
3911 3914
@@ -3989,7 +3992,7 @@ i915_gem_unpin_ioctl(struct drm_device *dev, void *data,
3989 obj->user_pin_count--; 3992 obj->user_pin_count--;
3990 if (obj->user_pin_count == 0) { 3993 if (obj->user_pin_count == 0) {
3991 obj->pin_filp = NULL; 3994 obj->pin_filp = NULL;
3992 i915_gem_object_unpin(obj); 3995 i915_gem_object_ggtt_unpin(obj);
3993 } 3996 }
3994 3997
3995out: 3998out:
@@ -4069,7 +4072,7 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
4069 goto unlock; 4072 goto unlock;
4070 } 4073 }
4071 4074
4072 if (obj->pin_count) { 4075 if (i915_gem_obj_is_pinned(obj)) {
4073 ret = -EINVAL; 4076 ret = -EINVAL;
4074 goto out; 4077 goto out;
4075 } 4078 }
@@ -4178,12 +4181,14 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj)
4178 if (obj->phys_obj) 4181 if (obj->phys_obj)
4179 i915_gem_detach_phys_object(dev, obj); 4182 i915_gem_detach_phys_object(dev, obj);
4180 4183
4181 obj->pin_count = 0;
4182 /* NB: 0 or 1 elements */ 4184 /* NB: 0 or 1 elements */
4183 WARN_ON(!list_empty(&obj->vma_list) && 4185 WARN_ON(!list_empty(&obj->vma_list) &&
4184 !list_is_singular(&obj->vma_list)); 4186 !list_is_singular(&obj->vma_list));
4185 list_for_each_entry_safe(vma, next, &obj->vma_list, vma_link) { 4187 list_for_each_entry_safe(vma, next, &obj->vma_list, vma_link) {
4186 int ret = i915_vma_unbind(vma); 4188 int ret;
4189
4190 vma->pin_count = 0;
4191 ret = i915_vma_unbind(vma);
4187 if (WARN_ON(ret == -ERESTARTSYS)) { 4192 if (WARN_ON(ret == -ERESTARTSYS)) {
4188 bool was_interruptible; 4193 bool was_interruptible;
4189 4194
@@ -4963,7 +4968,7 @@ i915_gem_inactive_count(struct shrinker *shrinker, struct shrink_control *sc)
4963 if (obj->active) 4968 if (obj->active)
4964 continue; 4969 continue;
4965 4970
4966 if (obj->pin_count == 0 && obj->pages_pin_count == 0) 4971 if (!i915_gem_obj_is_pinned(obj) && obj->pages_pin_count == 0)
4967 count += obj->base.size >> PAGE_SHIFT; 4972 count += obj->base.size >> PAGE_SHIFT;
4968 } 4973 }
4969 4974
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 41877045a1a0..b06199175d41 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -241,7 +241,7 @@ static int create_default_context(struct drm_i915_private *dev_priv)
241 return 0; 241 return 0;
242 242
243err_unpin: 243err_unpin:
244 i915_gem_object_unpin(ctx->obj); 244 i915_gem_object_ggtt_unpin(ctx->obj);
245err_destroy: 245err_destroy:
246 i915_gem_context_unreference(ctx); 246 i915_gem_context_unreference(ctx);
247 return ret; 247 return ret;
@@ -300,11 +300,11 @@ void i915_gem_context_fini(struct drm_device *dev)
300 if (dev_priv->ring[RCS].last_context == dctx) { 300 if (dev_priv->ring[RCS].last_context == dctx) {
301 /* Fake switch to NULL context */ 301 /* Fake switch to NULL context */
302 WARN_ON(dctx->obj->active); 302 WARN_ON(dctx->obj->active);
303 i915_gem_object_unpin(dctx->obj); 303 i915_gem_object_ggtt_unpin(dctx->obj);
304 i915_gem_context_unreference(dctx); 304 i915_gem_context_unreference(dctx);
305 } 305 }
306 306
307 i915_gem_object_unpin(dctx->obj); 307 i915_gem_object_ggtt_unpin(dctx->obj);
308 i915_gem_context_unreference(dctx); 308 i915_gem_context_unreference(dctx);
309 dev_priv->ring[RCS].default_context = NULL; 309 dev_priv->ring[RCS].default_context = NULL;
310 dev_priv->ring[RCS].last_context = NULL; 310 dev_priv->ring[RCS].last_context = NULL;
@@ -412,7 +412,7 @@ static int do_switch(struct i915_hw_context *to)
412 u32 hw_flags = 0; 412 u32 hw_flags = 0;
413 int ret, i; 413 int ret, i;
414 414
415 BUG_ON(from != NULL && from->obj != NULL && from->obj->pin_count == 0); 415 BUG_ON(from != NULL && from->obj != NULL && !i915_gem_obj_is_pinned(from->obj));
416 416
417 if (from == to && !to->remap_slice) 417 if (from == to && !to->remap_slice)
418 return 0; 418 return 0;
@@ -428,7 +428,7 @@ static int do_switch(struct i915_hw_context *to)
428 * XXX: We need a real interface to do this instead of trickery. */ 428 * XXX: We need a real interface to do this instead of trickery. */
429 ret = i915_gem_object_set_to_gtt_domain(to->obj, false); 429 ret = i915_gem_object_set_to_gtt_domain(to->obj, false);
430 if (ret) { 430 if (ret) {
431 i915_gem_object_unpin(to->obj); 431 i915_gem_object_ggtt_unpin(to->obj);
432 return ret; 432 return ret;
433 } 433 }
434 434
@@ -440,7 +440,7 @@ static int do_switch(struct i915_hw_context *to)
440 440
441 ret = mi_set_context(ring, to, hw_flags); 441 ret = mi_set_context(ring, to, hw_flags);
442 if (ret) { 442 if (ret) {
443 i915_gem_object_unpin(to->obj); 443 i915_gem_object_ggtt_unpin(to->obj);
444 return ret; 444 return ret;
445 } 445 }
446 446
@@ -476,7 +476,7 @@ static int do_switch(struct i915_hw_context *to)
476 BUG_ON(from->obj->ring != ring); 476 BUG_ON(from->obj->ring != ring);
477 477
478 /* obj is kept alive until the next request by its active ref */ 478 /* obj is kept alive until the next request by its active ref */
479 i915_gem_object_unpin(from->obj); 479 i915_gem_object_ggtt_unpin(from->obj);
480 i915_gem_context_unreference(from); 480 i915_gem_context_unreference(from);
481 } 481 }
482 482
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
index b7376533633d..5cb0aa4fadc7 100644
--- a/drivers/gpu/drm/i915/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/i915_gem_evict.c
@@ -34,7 +34,8 @@
34static bool 34static bool
35mark_free(struct i915_vma *vma, struct list_head *unwind) 35mark_free(struct i915_vma *vma, struct list_head *unwind)
36{ 36{
37 if (vma->obj->pin_count) 37 /* Freeing up memory requires no VMAs are pinned */
38 if (i915_gem_obj_is_pinned(vma->obj))
38 return false; 39 return false;
39 40
40 if (WARN_ON(!list_empty(&vma->exec_list))) 41 if (WARN_ON(!list_empty(&vma->exec_list)))
@@ -186,7 +187,7 @@ int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle)
186 } 187 }
187 188
188 list_for_each_entry_safe(vma, next, &vm->inactive_list, mm_list) 189 list_for_each_entry_safe(vma, next, &vm->inactive_list, mm_list)
189 if (vma->obj->pin_count == 0) 190 if (vma->pin_count == 0)
190 WARN_ON(i915_vma_unbind(vma)); 191 WARN_ON(i915_vma_unbind(vma));
191 192
192 return 0; 193 return 0;
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 9282b4c411f6..a2d6eb5336e3 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -566,7 +566,7 @@ i915_gem_execbuffer_unreserve_vma(struct i915_vma *vma)
566 i915_gem_object_unpin_fence(obj); 566 i915_gem_object_unpin_fence(obj);
567 567
568 if (entry->flags & __EXEC_OBJECT_HAS_PIN) 568 if (entry->flags & __EXEC_OBJECT_HAS_PIN)
569 i915_gem_object_unpin(obj); 569 vma->pin_count--;
570 570
571 entry->flags &= ~(__EXEC_OBJECT_HAS_FENCE | __EXEC_OBJECT_HAS_PIN); 571 entry->flags &= ~(__EXEC_OBJECT_HAS_FENCE | __EXEC_OBJECT_HAS_PIN);
572} 572}
@@ -923,7 +923,9 @@ i915_gem_execbuffer_move_to_active(struct list_head *vmas,
923 if (obj->base.write_domain) { 923 if (obj->base.write_domain) {
924 obj->dirty = 1; 924 obj->dirty = 1;
925 obj->last_write_seqno = intel_ring_get_seqno(ring); 925 obj->last_write_seqno = intel_ring_get_seqno(ring);
926 if (obj->pin_count) /* check for potential scanout */ 926 /* check for potential scanout */
927 if (i915_gem_obj_ggtt_bound(obj) &&
928 i915_gem_obj_to_ggtt(obj)->pin_count)
927 intel_mark_fb_busy(obj, ring); 929 intel_mark_fb_busy(obj, ring);
928 } 930 }
929 931
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index b13905348048..eb993584aa6b 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -308,7 +308,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
308 return -EINVAL; 308 return -EINVAL;
309 } 309 }
310 310
311 if (obj->pin_count || obj->framebuffer_references) { 311 if (i915_gem_obj_is_pinned(obj) || obj->framebuffer_references) {
312 drm_gem_object_unreference_unlocked(&obj->base); 312 drm_gem_object_unreference_unlocked(&obj->base);
313 return -EBUSY; 313 return -EBUSY;
314 } 314 }
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index 99322432e320..5dede92396c8 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -578,7 +578,7 @@ static void capture_bo(struct drm_i915_error_buffer *err,
578 err->write_domain = obj->base.write_domain; 578 err->write_domain = obj->base.write_domain;
579 err->fence_reg = obj->fence_reg; 579 err->fence_reg = obj->fence_reg;
580 err->pinned = 0; 580 err->pinned = 0;
581 if (obj->pin_count > 0) 581 if (i915_gem_obj_is_pinned(obj))
582 err->pinned = 1; 582 err->pinned = 1;
583 if (obj->user_pin_count > 0) 583 if (obj->user_pin_count > 0)
584 err->pinned = -1; 584 err->pinned = -1;
@@ -611,7 +611,7 @@ static u32 capture_pinned_bo(struct drm_i915_error_buffer *err,
611 int i = 0; 611 int i = 0;
612 612
613 list_for_each_entry(obj, head, global_list) { 613 list_for_each_entry(obj, head, global_list) {
614 if (obj->pin_count == 0) 614 if (!i915_gem_obj_is_pinned(obj))
615 continue; 615 continue;
616 616
617 capture_bo(err++, obj); 617 capture_bo(err++, obj);
@@ -875,7 +875,7 @@ static void i915_gem_capture_vm(struct drm_i915_private *dev_priv,
875 i++; 875 i++;
876 error->active_bo_count[ndx] = i; 876 error->active_bo_count[ndx] = i;
877 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) 877 list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list)
878 if (obj->pin_count) 878 if (i915_gem_obj_is_pinned(obj))
879 i++; 879 i++;
880 error->pinned_bo_count[ndx] = i - error->active_bo_count[ndx]; 880 error->pinned_bo_count[ndx] = i - error->active_bo_count[ndx];
881 881
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index 284c3eb066f6..d53c17db30de 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -104,7 +104,7 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
104 return 0; 104 return 0;
105 105
106out_unpin: 106out_unpin:
107 i915_gem_object_unpin(obj); 107 i915_gem_object_ggtt_unpin(obj);
108out_unref: 108out_unref:
109 drm_gem_object_unreference(&obj->base); 109 drm_gem_object_unreference(&obj->base);
110out: 110out:
@@ -208,7 +208,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
208 return 0; 208 return 0;
209 209
210out_unpin: 210out_unpin:
211 i915_gem_object_unpin(obj); 211 i915_gem_object_ggtt_unpin(obj);
212 drm_gem_object_unreference(&obj->base); 212 drm_gem_object_unreference(&obj->base);
213out_unlock: 213out_unlock:
214 mutex_unlock(&dev->struct_mutex); 214 mutex_unlock(&dev->struct_mutex);
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index a98a990fbab3..a1397b1646af 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -293,7 +293,7 @@ static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay)
293{ 293{
294 struct drm_i915_gem_object *obj = overlay->old_vid_bo; 294 struct drm_i915_gem_object *obj = overlay->old_vid_bo;
295 295
296 i915_gem_object_unpin(obj); 296 i915_gem_object_ggtt_unpin(obj);
297 drm_gem_object_unreference(&obj->base); 297 drm_gem_object_unreference(&obj->base);
298 298
299 overlay->old_vid_bo = NULL; 299 overlay->old_vid_bo = NULL;
@@ -306,7 +306,7 @@ static void intel_overlay_off_tail(struct intel_overlay *overlay)
306 /* never have the overlay hw on without showing a frame */ 306 /* never have the overlay hw on without showing a frame */
307 BUG_ON(!overlay->vid_bo); 307 BUG_ON(!overlay->vid_bo);
308 308
309 i915_gem_object_unpin(obj); 309 i915_gem_object_ggtt_unpin(obj);
310 drm_gem_object_unreference(&obj->base); 310 drm_gem_object_unreference(&obj->base);
311 overlay->vid_bo = NULL; 311 overlay->vid_bo = NULL;
312 312
@@ -782,7 +782,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
782 return 0; 782 return 0;
783 783
784out_unpin: 784out_unpin:
785 i915_gem_object_unpin(new_bo); 785 i915_gem_object_ggtt_unpin(new_bo);
786 return ret; 786 return ret;
787} 787}
788 788
@@ -1386,7 +1386,7 @@ void intel_setup_overlay(struct drm_device *dev)
1386 1386
1387out_unpin_bo: 1387out_unpin_bo:
1388 if (!OVERLAY_NEEDS_PHYSICAL(dev)) 1388 if (!OVERLAY_NEEDS_PHYSICAL(dev))
1389 i915_gem_object_unpin(reg_bo); 1389 i915_gem_object_ggtt_unpin(reg_bo);
1390out_free_bo: 1390out_free_bo:
1391 drm_gem_object_unreference(&reg_bo->base); 1391 drm_gem_object_unreference(&reg_bo->base);
1392out_free: 1392out_free:
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 41b6e080e362..cba4be88eddb 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3298,7 +3298,7 @@ intel_alloc_context_page(struct drm_device *dev)
3298 return ctx; 3298 return ctx;
3299 3299
3300err_unpin: 3300err_unpin:
3301 i915_gem_object_unpin(ctx); 3301 i915_gem_object_ggtt_unpin(ctx);
3302err_unref: 3302err_unref:
3303 drm_gem_object_unreference(&ctx->base); 3303 drm_gem_object_unreference(&ctx->base);
3304 return NULL; 3304 return NULL;
@@ -4166,13 +4166,13 @@ void ironlake_teardown_rc6(struct drm_device *dev)
4166 struct drm_i915_private *dev_priv = dev->dev_private; 4166 struct drm_i915_private *dev_priv = dev->dev_private;
4167 4167
4168 if (dev_priv->ips.renderctx) { 4168 if (dev_priv->ips.renderctx) {
4169 i915_gem_object_unpin(dev_priv->ips.renderctx); 4169 i915_gem_object_ggtt_unpin(dev_priv->ips.renderctx);
4170 drm_gem_object_unreference(&dev_priv->ips.renderctx->base); 4170 drm_gem_object_unreference(&dev_priv->ips.renderctx->base);
4171 dev_priv->ips.renderctx = NULL; 4171 dev_priv->ips.renderctx = NULL;
4172 } 4172 }
4173 4173
4174 if (dev_priv->ips.pwrctx) { 4174 if (dev_priv->ips.pwrctx) {
4175 i915_gem_object_unpin(dev_priv->ips.pwrctx); 4175 i915_gem_object_ggtt_unpin(dev_priv->ips.pwrctx);
4176 drm_gem_object_unreference(&dev_priv->ips.pwrctx->base); 4176 drm_gem_object_unreference(&dev_priv->ips.pwrctx->base);
4177 dev_priv->ips.pwrctx = NULL; 4177 dev_priv->ips.pwrctx = NULL;
4178 } 4178 }
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index e05a0216cd9b..75c8883f58c1 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -549,7 +549,7 @@ init_pipe_control(struct intel_ring_buffer *ring)
549 return 0; 549 return 0;
550 550
551err_unpin: 551err_unpin:
552 i915_gem_object_unpin(ring->scratch.obj); 552 i915_gem_object_ggtt_unpin(ring->scratch.obj);
553err_unref: 553err_unref:
554 drm_gem_object_unreference(&ring->scratch.obj->base); 554 drm_gem_object_unreference(&ring->scratch.obj->base);
555err: 555err:
@@ -625,7 +625,7 @@ static void render_ring_cleanup(struct intel_ring_buffer *ring)
625 625
626 if (INTEL_INFO(dev)->gen >= 5) { 626 if (INTEL_INFO(dev)->gen >= 5) {
627 kunmap(sg_page(ring->scratch.obj->pages->sgl)); 627 kunmap(sg_page(ring->scratch.obj->pages->sgl));
628 i915_gem_object_unpin(ring->scratch.obj); 628 i915_gem_object_ggtt_unpin(ring->scratch.obj);
629 } 629 }
630 630
631 drm_gem_object_unreference(&ring->scratch.obj->base); 631 drm_gem_object_unreference(&ring->scratch.obj->base);
@@ -1250,7 +1250,7 @@ static void cleanup_status_page(struct intel_ring_buffer *ring)
1250 return; 1250 return;
1251 1251
1252 kunmap(sg_page(obj->pages->sgl)); 1252 kunmap(sg_page(obj->pages->sgl));
1253 i915_gem_object_unpin(obj); 1253 i915_gem_object_ggtt_unpin(obj);
1254 drm_gem_object_unreference(&obj->base); 1254 drm_gem_object_unreference(&obj->base);
1255 ring->status_page.obj = NULL; 1255 ring->status_page.obj = NULL;
1256} 1256}
@@ -1290,7 +1290,7 @@ static int init_status_page(struct intel_ring_buffer *ring)
1290 return 0; 1290 return 0;
1291 1291
1292err_unpin: 1292err_unpin:
1293 i915_gem_object_unpin(obj); 1293 i915_gem_object_ggtt_unpin(obj);
1294err_unref: 1294err_unref:
1295 drm_gem_object_unreference(&obj->base); 1295 drm_gem_object_unreference(&obj->base);
1296err: 1296err:
@@ -1387,7 +1387,7 @@ static int intel_init_ring_buffer(struct drm_device *dev,
1387err_unmap: 1387err_unmap:
1388 iounmap(ring->virtual_start); 1388 iounmap(ring->virtual_start);
1389err_unpin: 1389err_unpin:
1390 i915_gem_object_unpin(obj); 1390 i915_gem_object_ggtt_unpin(obj);
1391err_unref: 1391err_unref:
1392 drm_gem_object_unreference(&obj->base); 1392 drm_gem_object_unreference(&obj->base);
1393 ring->obj = NULL; 1393 ring->obj = NULL;
@@ -1415,7 +1415,7 @@ void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring)
1415 1415
1416 iounmap(ring->virtual_start); 1416 iounmap(ring->virtual_start);
1417 1417
1418 i915_gem_object_unpin(ring->obj); 1418 i915_gem_object_ggtt_unpin(ring->obj);
1419 drm_gem_object_unreference(&ring->obj->base); 1419 drm_gem_object_unreference(&ring->obj->base);
1420 ring->obj = NULL; 1420 ring->obj = NULL;
1421 ring->preallocated_lazy_request = NULL; 1421 ring->preallocated_lazy_request = NULL;