drm/i915: Unwind vma->pages allocation upon failure
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 27 Feb 2017 12:26:53 +0000 (12:26 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 27 Feb 2017 13:09:19 +0000 (13:09 +0000)
If we fail to allocate the ppgtt range after allocating the pages for
the vma, we should unwind the local allocation before reporting back the
failure.

Fixes: ff685975d97f ("drm/i915: Move allocate_va_range to GTT")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170227122654.27651-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_gtt.c

index c3a121ab8914dd5fd01504e2e9b1d6b848f6d599..875a48b9d05a81bb1c451a004797d3cda794834d 100644 (file)
@@ -2312,7 +2312,7 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
                                                             vma->node.start,
                                                             vma->node.size);
                        if (ret)
-                               return ret;
+                               goto err_pages;
                }
 
                appgtt->base.insert_entries(&appgtt->base,
@@ -2329,6 +2329,17 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
        }
 
        return 0;
+
+err_pages:
+       if (!(vma->flags & (I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND))) {
+               if (vma->pages != vma->obj->mm.pages) {
+                       GEM_BUG_ON(!vma->pages);
+                       sg_free_table(vma->pages);
+                       kfree(vma->pages);
+               }
+               vma->pages = NULL;
+       }
+       return ret;
 }
 
 static void aliasing_gtt_unbind_vma(struct i915_vma *vma)