diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 39 |
1 files changed, 14 insertions, 25 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 67e2cd5636ec..d49ac1c2e396 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -50,8 +50,7 @@ static int i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, | |||
50 | unsigned alignment); | 50 | unsigned alignment); |
51 | static void i915_gem_clear_fence_reg(struct drm_gem_object *obj); | 51 | static void i915_gem_clear_fence_reg(struct drm_gem_object *obj); |
52 | static int i915_gem_evict_something(struct drm_device *dev, int min_size); | 52 | static int i915_gem_evict_something(struct drm_device *dev, int min_size); |
53 | static int i915_gem_evict_from_list(struct drm_device *dev, | 53 | static int i915_gem_evict_from_inactive_list(struct drm_device *dev); |
54 | struct list_head *head); | ||
55 | static int i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj, | 54 | static int i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj, |
56 | struct drm_i915_gem_pwrite *args, | 55 | struct drm_i915_gem_pwrite *args, |
57 | struct drm_file *file_priv); | 56 | struct drm_file *file_priv); |
@@ -2095,7 +2094,7 @@ i915_gem_evict_everything(struct drm_device *dev) | |||
2095 | if (ret) | 2094 | if (ret) |
2096 | return ret; | 2095 | return ret; |
2097 | 2096 | ||
2098 | ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list); | 2097 | ret = i915_gem_evict_from_inactive_list(dev); |
2099 | if (ret) | 2098 | if (ret) |
2100 | return ret; | 2099 | return ret; |
2101 | 2100 | ||
@@ -2195,8 +2194,7 @@ i915_gem_evict_something(struct drm_device *dev, int min_size) | |||
2195 | */ | 2194 | */ |
2196 | if (!list_empty (&dev_priv->mm.inactive_list)) { | 2195 | if (!list_empty (&dev_priv->mm.inactive_list)) { |
2197 | DRM_INFO("GTT full, evicting inactive buffers\n"); | 2196 | DRM_INFO("GTT full, evicting inactive buffers\n"); |
2198 | return i915_gem_evict_from_list(dev, | 2197 | return i915_gem_evict_from_inactive_list(dev); |
2199 | &dev_priv->mm.inactive_list); | ||
2200 | } else | 2198 | } else |
2201 | return i915_gem_evict_everything(dev); | 2199 | return i915_gem_evict_everything(dev); |
2202 | } | 2200 | } |
@@ -4155,36 +4153,27 @@ void i915_gem_free_object(struct drm_gem_object *obj) | |||
4155 | kfree(obj->driver_private); | 4153 | kfree(obj->driver_private); |
4156 | } | 4154 | } |
4157 | 4155 | ||
4158 | /** Unbinds all objects that are on the given buffer list. */ | 4156 | /** Unbinds all inactive objects. */ |
4159 | static int | 4157 | static int |
4160 | i915_gem_evict_from_list(struct drm_device *dev, struct list_head *head) | 4158 | i915_gem_evict_from_inactive_list(struct drm_device *dev) |
4161 | { | 4159 | { |
4162 | struct drm_gem_object *obj; | 4160 | drm_i915_private_t *dev_priv = dev->dev_private; |
4163 | struct drm_i915_gem_object *obj_priv; | ||
4164 | int ret; | ||
4165 | 4161 | ||
4166 | while (!list_empty(head)) { | 4162 | while (!list_empty(&dev_priv->mm.inactive_list)) { |
4167 | obj_priv = list_first_entry(head, | 4163 | struct drm_gem_object *obj; |
4168 | struct drm_i915_gem_object, | 4164 | int ret; |
4169 | list); | ||
4170 | obj = obj_priv->obj; | ||
4171 | 4165 | ||
4172 | if (obj_priv->pin_count != 0) { | 4166 | obj = list_first_entry(&dev_priv->mm.inactive_list, |
4173 | DRM_ERROR("Pinned object in unbind list\n"); | 4167 | struct drm_i915_gem_object, |
4174 | mutex_unlock(&dev->struct_mutex); | 4168 | list)->obj; |
4175 | return -EINVAL; | ||
4176 | } | ||
4177 | 4169 | ||
4178 | ret = i915_gem_object_unbind(obj); | 4170 | ret = i915_gem_object_unbind(obj); |
4179 | if (ret != 0) { | 4171 | if (ret != 0) { |
4180 | DRM_ERROR("Error unbinding object in LeaveVT: %d\n", | 4172 | DRM_ERROR("Error unbinding object: %d\n", ret); |
4181 | ret); | ||
4182 | mutex_unlock(&dev->struct_mutex); | ||
4183 | return ret; | 4173 | return ret; |
4184 | } | 4174 | } |
4185 | } | 4175 | } |
4186 | 4176 | ||
4187 | |||
4188 | return 0; | 4177 | return 0; |
4189 | } | 4178 | } |
4190 | 4179 | ||
@@ -4301,7 +4290,7 @@ i915_gem_idle(struct drm_device *dev) | |||
4301 | 4290 | ||
4302 | 4291 | ||
4303 | /* Move all inactive buffers out of the GTT. */ | 4292 | /* Move all inactive buffers out of the GTT. */ |
4304 | ret = i915_gem_evict_from_list(dev, &dev_priv->mm.inactive_list); | 4293 | ret = i915_gem_evict_from_inactive_list(dev); |
4305 | WARN_ON(!list_empty(&dev_priv->mm.inactive_list)); | 4294 | WARN_ON(!list_empty(&dev_priv->mm.inactive_list)); |
4306 | if (ret) { | 4295 | if (ret) { |
4307 | mutex_unlock(&dev->struct_mutex); | 4296 | mutex_unlock(&dev->struct_mutex); |