Commit ef2d633e authored by Daniel Vetter's avatar Daniel Vetter

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: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent a0bae57f
...@@ -10526,18 +10526,13 @@ static void intel_setup_outputs(struct drm_device *dev) ...@@ -10526,18 +10526,13 @@ static void intel_setup_outputs(struct drm_device *dev)
drm_helper_move_panel_connectors_to_head(dev); drm_helper_move_panel_connectors_to_head(dev);
} }
void intel_framebuffer_fini(struct intel_framebuffer *fb)
{
drm_framebuffer_cleanup(&fb->base);
WARN_ON(!fb->obj->framebuffer_references--);
drm_gem_object_unreference_unlocked(&fb->obj->base);
}
static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb) static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
{ {
struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
intel_framebuffer_fini(intel_fb); drm_framebuffer_cleanup(fb);
WARN_ON(!intel_fb->obj->framebuffer_references--);
drm_gem_object_unreference_unlocked(&intel_fb->obj->base);
kfree(intel_fb); kfree(intel_fb);
} }
......
...@@ -685,7 +685,6 @@ int intel_framebuffer_init(struct drm_device *dev, ...@@ -685,7 +685,6 @@ int intel_framebuffer_init(struct drm_device *dev,
struct intel_framebuffer *ifb, struct intel_framebuffer *ifb,
struct drm_mode_fb_cmd2 *mode_cmd, struct drm_mode_fb_cmd2 *mode_cmd,
struct drm_i915_gem_object *obj); struct drm_i915_gem_object *obj);
void intel_framebuffer_fini(struct intel_framebuffer *fb);
void intel_prepare_page_flip(struct drm_device *dev, int plane); void intel_prepare_page_flip(struct drm_device *dev, int plane);
void intel_finish_page_flip(struct drm_device *dev, int pipe); void intel_finish_page_flip(struct drm_device *dev, int pipe);
void intel_finish_page_flip_plane(struct drm_device *dev, int plane); void intel_finish_page_flip_plane(struct drm_device *dev, int plane);
......
...@@ -269,8 +269,7 @@ static void intel_fbdev_destroy(struct drm_device *dev, ...@@ -269,8 +269,7 @@ static void intel_fbdev_destroy(struct drm_device *dev,
drm_fb_helper_fini(&ifbdev->helper); drm_fb_helper_fini(&ifbdev->helper);
drm_framebuffer_unregister_private(&ifbdev->fb->base); drm_framebuffer_unregister_private(&ifbdev->fb->base);
intel_framebuffer_fini(ifbdev->fb); drm_framebuffer_unreference(&ifbdev->fb->base);
kfree(ifbdev->fb);
} }
int intel_fbdev_init(struct drm_device *dev) int intel_fbdev_init(struct drm_device *dev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment