aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2014-02-10 12:00:38 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-02-12 12:53:02 -0500
commitef2d633e9bcfdb73e536ca81b835dd015fe24ceb (patch)
treed16d298b2b78362a08235cb5f97686465e87d1e3
parenta0bae57f5b9d61c64f5c2675a53fec27baf583d9 (diff)
drm/i915: Use normal fb deref for the fbcon framebuffer
Now that it's a normally kmalloce buffer we can use the usual cleanup paths. The upside here is that if we get the refcounting wrong will be able to catch it, since the drm core will complain about leftover framebuffers and kref about underflows. v2: Kill intel_framebuffer_fini - no longer needed now that we refcount all fbs properly and only confusing. v3: We actually still need to call unregister_private to remove the fb from the idr and drop the idr reference - the final unref doesn't do that. So much for remembering my own fb liftime rules. Reported by Imre Deak. Cc: Jesse Barnes <jbarnes@virtuousgeek.org> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> (v2) Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c11
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
-rw-r--r--drivers/gpu/drm/i915/intel_fbdev.c3
3 files changed, 4 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 1b2faa44764b..6600931f213c 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -10526,18 +10526,13 @@ static void intel_setup_outputs(struct drm_device *dev)
10526 drm_helper_move_panel_connectors_to_head(dev); 10526 drm_helper_move_panel_connectors_to_head(dev);
10527} 10527}
10528 10528
10529void intel_framebuffer_fini(struct intel_framebuffer *fb)
10530{
10531 drm_framebuffer_cleanup(&fb->base);
10532 WARN_ON(!fb->obj->framebuffer_references--);
10533 drm_gem_object_unreference_unlocked(&fb->obj->base);
10534}
10535
10536static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb) 10529static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
10537{ 10530{
10538 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); 10531 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
10539 10532
10540 intel_framebuffer_fini(intel_fb); 10533 drm_framebuffer_cleanup(fb);
10534 WARN_ON(!intel_fb->obj->framebuffer_references--);
10535 drm_gem_object_unreference_unlocked(&intel_fb->obj->base);
10541 kfree(intel_fb); 10536 kfree(intel_fb);
10542} 10537}
10543 10538
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 4386faf34a9b..59348a4d0238 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -685,7 +685,6 @@ int intel_framebuffer_init(struct drm_device *dev,
685 struct intel_framebuffer *ifb, 685 struct intel_framebuffer *ifb,
686 struct drm_mode_fb_cmd2 *mode_cmd, 686 struct drm_mode_fb_cmd2 *mode_cmd,
687 struct drm_i915_gem_object *obj); 687 struct drm_i915_gem_object *obj);
688void intel_framebuffer_fini(struct intel_framebuffer *fb);
689void intel_prepare_page_flip(struct drm_device *dev, int plane); 688void intel_prepare_page_flip(struct drm_device *dev, int plane);
690void intel_finish_page_flip(struct drm_device *dev, int pipe); 689void intel_finish_page_flip(struct drm_device *dev, int pipe);
691void intel_finish_page_flip_plane(struct drm_device *dev, int plane); 690void intel_finish_page_flip_plane(struct drm_device *dev, int plane);
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index cd969c3c301e..9aa26e59a1ab 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -269,8 +269,7 @@ static void intel_fbdev_destroy(struct drm_device *dev,
269 drm_fb_helper_fini(&ifbdev->helper); 269 drm_fb_helper_fini(&ifbdev->helper);
270 270
271 drm_framebuffer_unregister_private(&ifbdev->fb->base); 271 drm_framebuffer_unregister_private(&ifbdev->fb->base);
272 intel_framebuffer_fini(ifbdev->fb); 272 drm_framebuffer_unreference(&ifbdev->fb->base);
273 kfree(ifbdev->fb);
274} 273}
275 274
276int intel_fbdev_init(struct drm_device *dev) 275int intel_fbdev_init(struct drm_device *dev)