| From e3b596e2379e1ee1cb7d9bc4ab69f4cedd10a9f3 Mon Sep 17 00:00:00 2001 |
| From: Mika Kuoppala <mika.kuoppala@linux.intel.com> |
| Date: Fri, 3 May 2013 16:29:08 +0300 |
| Subject: drm/i915: unreference default context on module unload |
| |
| Before module unload is called, gpu_idle() will switch |
| to default context. This will increment ref count of base |
| object as the default context is 'running' on module unload |
| time. Unreference the drm object so that when context |
| is freed, base object is freed as well. |
| |
| v2: added comment to explain the refcounts (Ben Widawsky) |
| |
| Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> |
| Reviewed-by: Ben Widawsky <ben@bwidawsk.net> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 168f83660211b9e059e3bc0638daaa01e9ea0b71) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_gem_context.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c |
| index 47ffea61c9fa..fa7d4a74af22 100644 |
| --- a/drivers/gpu/drm/i915/i915_gem_context.c |
| +++ b/drivers/gpu/drm/i915/i915_gem_context.c |
| @@ -274,6 +274,14 @@ void i915_gem_context_fini(struct drm_device *dev) |
| intel_gpu_reset(dev); |
| |
| i915_gem_object_unpin(dctx->obj); |
| + |
| + /* When default context is created and switched to, base object refcount |
| + * will be 2 (+1 from object creation and +1 from do_switch()). |
| + * i915_gem_context_fini() will be called after gpu_idle() has switched |
| + * to default context. So we need to unreference the base object once |
| + * to offset the do_switch part, so that i915_gem_context_unreference() |
| + * can then free the base object correctly. */ |
| + drm_gem_object_unreference(&dctx->obj->base); |
| i915_gem_context_unreference(dctx); |
| } |
| |
| -- |
| 1.8.5.rc3 |
| |