drm/i915/evict: Ensure we completely cleanup on failure
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 10 Jan 2011 14:21:05 +0000 (14:21 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 11 Jan 2011 22:55:39 +0000 (22:55 +0000)
... and not leave the objects in a inconsistent state.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: stable@kernel.org
drivers/gpu/drm/i915/i915_gem_evict.c

index 78b8cf90c922f7a8c9a588aff54d9d8561e020f2..3d39005540aad82a5b72df9b1efeeec1cb0b9813 100644 (file)
@@ -127,9 +127,15 @@ i915_gem_evict_something(struct drm_device *dev, int min_size,
        }
 
        /* Nothing found, clean up and bail out! */
-       list_for_each_entry(obj, &unwind_list, exec_list) {
+       while (!list_empty(&unwind_list)) {
+               obj = list_first_entry(&unwind_list,
+                                      struct drm_i915_gem_object,
+                                      exec_list);
+
                ret = drm_mm_scan_remove_block(obj->gtt_space);
                BUG_ON(ret);
+
+               list_del_init(&obj->exec_list);
                drm_gem_object_unreference(&obj->base);
        }
 
@@ -162,6 +168,7 @@ found:
                                       exec_list);
                if (ret == 0)
                        ret = i915_gem_object_unbind(obj);
+
                list_del_init(&obj->exec_list);
                drm_gem_object_unreference(&obj->base);
        }