diff options
author | Ben Widawsky <benjamin.widawsky@intel.com> | 2013-12-06 17:10:55 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-12-18 09:27:49 -0500 |
commit | d7f46fc4e7323887494db13f063a8e59861fefb0 (patch) | |
tree | 7b58d50a01f965ef5f814de57ece105b77cbeb10 /drivers/gpu/drm/i915 | |
parent | 685987c6915222730f45141a89f1cd87fb092e9a (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.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 34 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 49 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_context.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_evict.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_tiling.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gpu_error.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_fbdev.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_overlay.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 12 |
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 | |||
125 | describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) | 125 | describe_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 | ||
656 | struct i915_ctx_hang_stats { | 669 | struct 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); |
2008 | void i915_gem_object_unpin(struct drm_i915_gem_object *obj); | 2009 | void i915_gem_object_ggtt_unpin(struct drm_i915_gem_object *obj); |
2009 | int __must_check i915_vma_unbind(struct i915_vma *vma); | 2010 | int __must_check i915_vma_unbind(struct i915_vma *vma); |
2010 | int __must_check i915_gem_object_ggtt_unbind(struct drm_i915_gem_object *obj); | 2011 | int __must_check i915_gem_object_ggtt_unbind(struct drm_i915_gem_object *obj); |
2011 | int i915_gem_object_put_pages(struct drm_i915_gem_object *obj); | 2012 | int 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 | ||
2170 | struct i915_vma *i915_gem_obj_to_ggtt(struct drm_i915_gem_object *obj); | 2171 | struct i915_vma *i915_gem_obj_to_ggtt(struct drm_i915_gem_object *obj); |
2172 | static 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 | ||
653 | out_unpin: | 653 | out_unpin: |
654 | i915_gem_object_unpin(obj); | 654 | i915_gem_object_ggtt_unpin(obj); |
655 | out: | 655 | out: |
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); |
1420 | unpin: | 1420 | unpin: |
1421 | i915_gem_object_unpin(obj); | 1421 | i915_gem_object_ggtt_unpin(obj); |
1422 | unlock: | 1422 | unlock: |
1423 | mutex_unlock(&dev->struct_mutex); | 1423 | mutex_unlock(&dev->struct_mutex); |
1424 | out: | 1424 | out: |
@@ -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: | |||
3720 | void | 3720 | void |
3721 | i915_gem_object_unpin_from_display_plane(struct drm_i915_gem_object *obj) | 3721 | i915_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 | ||
3902 | void | 3902 | void |
3903 | i915_gem_object_unpin(struct drm_i915_gem_object *obj) | 3903 | i915_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 | ||
3995 | out: | 3998 | out: |
@@ -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 | ||
243 | err_unpin: | 243 | err_unpin: |
244 | i915_gem_object_unpin(ctx->obj); | 244 | i915_gem_object_ggtt_unpin(ctx->obj); |
245 | err_destroy: | 245 | err_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 @@ | |||
34 | static bool | 34 | static bool |
35 | mark_free(struct i915_vma *vma, struct list_head *unwind) | 35 | mark_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 | ||
106 | out_unpin: | 106 | out_unpin: |
107 | i915_gem_object_unpin(obj); | 107 | i915_gem_object_ggtt_unpin(obj); |
108 | out_unref: | 108 | out_unref: |
109 | drm_gem_object_unreference(&obj->base); | 109 | drm_gem_object_unreference(&obj->base); |
110 | out: | 110 | out: |
@@ -208,7 +208,7 @@ static int intelfb_create(struct drm_fb_helper *helper, | |||
208 | return 0; | 208 | return 0; |
209 | 209 | ||
210 | out_unpin: | 210 | out_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); |
213 | out_unlock: | 213 | out_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 | ||
784 | out_unpin: | 784 | out_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 | ||
1387 | out_unpin_bo: | 1387 | out_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); |
1390 | out_free_bo: | 1390 | out_free_bo: |
1391 | drm_gem_object_unreference(®_bo->base); | 1391 | drm_gem_object_unreference(®_bo->base); |
1392 | out_free: | 1392 | out_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 | ||
3300 | err_unpin: | 3300 | err_unpin: |
3301 | i915_gem_object_unpin(ctx); | 3301 | i915_gem_object_ggtt_unpin(ctx); |
3302 | err_unref: | 3302 | err_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 | ||
551 | err_unpin: | 551 | err_unpin: |
552 | i915_gem_object_unpin(ring->scratch.obj); | 552 | i915_gem_object_ggtt_unpin(ring->scratch.obj); |
553 | err_unref: | 553 | err_unref: |
554 | drm_gem_object_unreference(&ring->scratch.obj->base); | 554 | drm_gem_object_unreference(&ring->scratch.obj->base); |
555 | err: | 555 | err: |
@@ -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 | ||
1292 | err_unpin: | 1292 | err_unpin: |
1293 | i915_gem_object_unpin(obj); | 1293 | i915_gem_object_ggtt_unpin(obj); |
1294 | err_unref: | 1294 | err_unref: |
1295 | drm_gem_object_unreference(&obj->base); | 1295 | drm_gem_object_unreference(&obj->base); |
1296 | err: | 1296 | err: |
@@ -1387,7 +1387,7 @@ static int intel_init_ring_buffer(struct drm_device *dev, | |||
1387 | err_unmap: | 1387 | err_unmap: |
1388 | iounmap(ring->virtual_start); | 1388 | iounmap(ring->virtual_start); |
1389 | err_unpin: | 1389 | err_unpin: |
1390 | i915_gem_object_unpin(obj); | 1390 | i915_gem_object_ggtt_unpin(obj); |
1391 | err_unref: | 1391 | err_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; |