diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 3de62b0127a5..dfe7174a7c03 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -192,6 +192,18 @@ i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, | |||
192 | return 0; | 192 | return 0; |
193 | } | 193 | } |
194 | 194 | ||
195 | void *i915_gem_object_alloc(struct drm_device *dev) | ||
196 | { | ||
197 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
198 | return kmem_cache_alloc(dev_priv->slab, GFP_KERNEL | __GFP_ZERO); | ||
199 | } | ||
200 | |||
201 | void i915_gem_object_free(struct drm_i915_gem_object *obj) | ||
202 | { | ||
203 | struct drm_i915_private *dev_priv = obj->base.dev->dev_private; | ||
204 | kmem_cache_free(dev_priv->slab, obj); | ||
205 | } | ||
206 | |||
195 | static int | 207 | static int |
196 | i915_gem_create(struct drm_file *file, | 208 | i915_gem_create(struct drm_file *file, |
197 | struct drm_device *dev, | 209 | struct drm_device *dev, |
@@ -215,7 +227,7 @@ i915_gem_create(struct drm_file *file, | |||
215 | if (ret) { | 227 | if (ret) { |
216 | drm_gem_object_release(&obj->base); | 228 | drm_gem_object_release(&obj->base); |
217 | i915_gem_info_remove_obj(dev->dev_private, obj->base.size); | 229 | i915_gem_info_remove_obj(dev->dev_private, obj->base.size); |
218 | kfree(obj); | 230 | i915_gem_object_free(obj); |
219 | return ret; | 231 | return ret; |
220 | } | 232 | } |
221 | 233 | ||
@@ -3695,12 +3707,12 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev, | |||
3695 | struct address_space *mapping; | 3707 | struct address_space *mapping; |
3696 | u32 mask; | 3708 | u32 mask; |
3697 | 3709 | ||
3698 | obj = kzalloc(sizeof(*obj), GFP_KERNEL); | 3710 | obj = i915_gem_object_alloc(dev); |
3699 | if (obj == NULL) | 3711 | if (obj == NULL) |
3700 | return NULL; | 3712 | return NULL; |
3701 | 3713 | ||
3702 | if (drm_gem_object_init(dev, &obj->base, size) != 0) { | 3714 | if (drm_gem_object_init(dev, &obj->base, size) != 0) { |
3703 | kfree(obj); | 3715 | i915_gem_object_free(obj); |
3704 | return NULL; | 3716 | return NULL; |
3705 | } | 3717 | } |
3706 | 3718 | ||
@@ -3783,7 +3795,7 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj) | |||
3783 | i915_gem_info_remove_obj(dev_priv, obj->base.size); | 3795 | i915_gem_info_remove_obj(dev_priv, obj->base.size); |
3784 | 3796 | ||
3785 | kfree(obj->bit_17); | 3797 | kfree(obj->bit_17); |
3786 | kfree(obj); | 3798 | i915_gem_object_free(obj); |
3787 | } | 3799 | } |
3788 | 3800 | ||
3789 | int | 3801 | int |
@@ -4101,8 +4113,14 @@ init_ring_lists(struct intel_ring_buffer *ring) | |||
4101 | void | 4113 | void |
4102 | i915_gem_load(struct drm_device *dev) | 4114 | i915_gem_load(struct drm_device *dev) |
4103 | { | 4115 | { |
4104 | int i; | ||
4105 | drm_i915_private_t *dev_priv = dev->dev_private; | 4116 | drm_i915_private_t *dev_priv = dev->dev_private; |
4117 | int i; | ||
4118 | |||
4119 | dev_priv->slab = | ||
4120 | kmem_cache_create("i915_gem_object", | ||
4121 | sizeof(struct drm_i915_gem_object), 0, | ||
4122 | SLAB_HWCACHE_ALIGN, | ||
4123 | NULL); | ||
4106 | 4124 | ||
4107 | INIT_LIST_HEAD(&dev_priv->mm.active_list); | 4125 | INIT_LIST_HEAD(&dev_priv->mm.active_list); |
4108 | INIT_LIST_HEAD(&dev_priv->mm.inactive_list); | 4126 | INIT_LIST_HEAD(&dev_priv->mm.inactive_list); |