| From 8ef8ec6911e8776c8cbcdc516007803a5c8d92bd Mon Sep 17 00:00:00 2001 |
| From: Ben Widawsky <ben@bwidawsk.net> |
| Date: Fri, 31 May 2013 14:46:20 -0700 |
| Subject: drm/i915: Unpin stolen pages |
| |
| The way the stolen handling works is we take a pin on the backing pages, |
| but we never actually get a reference to the bo. On freeing objects |
| allocated with stolen memory, the final unref will end up freeing the |
| object with pinned pages count left. To enable an assertion to catch |
| bugs in this code path, this patch cleans up that remaining pin. |
| |
| Signed-off-by: Ben Widawsky <ben@bwidawsk.net> |
| Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 1d64ae719b436f2a5f8f5da801b4c560bf24aaa9) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_gem.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
| index 25f327cc1127..fdb203fb5cb1 100644 |
| --- a/drivers/gpu/drm/i915/i915_gem.c |
| +++ b/drivers/gpu/drm/i915/i915_gem.c |
| @@ -3892,6 +3892,11 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj) |
| dev_priv->mm.interruptible = was_interruptible; |
| } |
| |
| + /* Stolen objects don't hold a ref, but do hold pin count. Fix that up |
| + * before progressing. */ |
| + if (obj->stolen) |
| + i915_gem_object_unpin_pages(obj); |
| + |
| obj->pages_pin_count = 0; |
| i915_gem_object_put_pages(obj); |
| i915_gem_object_free_mmap_offset(obj); |
| -- |
| 1.8.5.rc3 |
| |