[Intel-gfx] [PATCH v4 01/25] drm/i915/fbdev: Call intel_unpin_fb_obj() on release
Chris Wilson
chris at chris-wilson.co.uk
Wed Apr 27 12:32:33 UTC 2016
On Wed, Apr 27, 2016 at 01:20:52PM +0100, Tvrtko Ursulin wrote:
>
> On 26/04/16 07:54, Chris Wilson wrote:
> >When releasing the intel_fbdev, we should unpin the framebuffer that we
> >pinned during construction.
> >
> >Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> >---
> > drivers/gpu/drm/i915/intel_display.c | 2 +-
> > drivers/gpu/drm/i915/intel_drv.h | 1 +
> > drivers/gpu/drm/i915/intel_fbdev.c | 7 ++++++-
> > 3 files changed, 8 insertions(+), 2 deletions(-)
> >
> >diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> >index b7cb632a2a31..87ce7852482b 100644
> >--- a/drivers/gpu/drm/i915/intel_display.c
> >+++ b/drivers/gpu/drm/i915/intel_display.c
> >@@ -2309,7 +2309,7 @@ err_pm:
> > return ret;
> > }
> >
> >-static void intel_unpin_fb_obj(struct drm_framebuffer *fb, unsigned int rotation)
> >+void intel_unpin_fb_obj(struct drm_framebuffer *fb, unsigned int rotation)
> > {
> > struct drm_i915_gem_object *obj = intel_fb_obj(fb);
> > struct i915_ggtt_view view;
> >diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> >index b9f1304439e2..54f7000e2fe9 100644
> >--- a/drivers/gpu/drm/i915/intel_drv.h
> >+++ b/drivers/gpu/drm/i915/intel_drv.h
> >@@ -1161,6 +1161,7 @@ void intel_release_load_detect_pipe(struct drm_connector *connector,
> > struct drm_modeset_acquire_ctx *ctx);
> > int intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
> > unsigned int rotation);
> >+void intel_unpin_fb_obj(struct drm_framebuffer *fb, unsigned int rotation);
> > struct drm_framebuffer *
> > __intel_framebuffer_create(struct drm_device *dev,
> > struct drm_mode_fb_cmd2 *mode_cmd,
> >diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
> >index af561542a5a1..1c3ad121f1b9 100644
> >--- a/drivers/gpu/drm/i915/intel_fbdev.c
> >+++ b/drivers/gpu/drm/i915/intel_fbdev.c
> >@@ -287,7 +287,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
> > out_destroy_fbi:
> > drm_fb_helper_release_fbi(helper);
> > out_unpin:
> >- i915_gem_object_ggtt_unpin(obj);
> >+ intel_unpin_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0));
> > out_unlock:
> > mutex_unlock(&dev->struct_mutex);
> > return ret;
> >@@ -551,6 +551,11 @@ static void intel_fbdev_destroy(struct drm_device *dev,
> >
> > if (ifbdev->fb) {
> > drm_framebuffer_unregister_private(&ifbdev->fb->base);
> >+
> >+ mutex_lock(&dev->struct_mutex);
> >+ intel_unpin_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0));
> >+ mutex_unlock(&dev->struct_mutex);
> >+
> > drm_framebuffer_remove(&ifbdev->fb->base);
>
> I think I've asked before - why this isn't the last fb reference so
> the obj unref would do the unpin automatically?
And I thought I answered that it was bad practice to leave it to the
core as then we can't detect a leak, and that later code I have will
complain about the pin_display leak here. With user pinning gone, every
pin should now be accountable and anything remaining should be a WARN.
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list