drm/i915: Decouple the object from the unbound list before freeing pages
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 3 Dec 2012 11:49:00 +0000 (11:49 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 3 Dec 2012 16:22:16 +0000 (17:22 +0100)
As we may actually allocate in order to save the physical swizzling bits
during the free, we have to be careful not to trigger the shrinker on
the same object.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
[danvet: Added a small comment in the code to really drive the
scariness of this patch home.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_gem.c

index 4ef8b5714337f20f7fb3a44a69c69a6cce574d1c..c1f691958f89bf1c6754a2576a3a21bff1140e86 100644 (file)
@@ -1696,10 +1696,14 @@ i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
        if (obj->pages_pin_count)
                return -EBUSY;
 
+       /* ->put_pages might need to allocate memory for the bit17 swizzle
+        * array, hence protect them from being reaped by removing them from gtt
+        * lists early. */
+       list_del(&obj->gtt_list);
+
        ops->put_pages(obj);
        obj->pages = NULL;
 
-       list_del(&obj->gtt_list);
        if (i915_gem_object_is_purgeable(obj))
                i915_gem_object_truncate(obj);