drm: refcnt drm_framebuffer (v4.1)
authorRob Clark <rob@ti.com>
Wed, 5 Sep 2012 21:48:38 +0000 (21:48 +0000)
committerDave Airlie <airlied@redhat.com>
Tue, 2 Oct 2012 12:15:39 +0000 (22:15 +1000)
commitf7eff60ea0e4e35732604e3591e2ff7b3ef41981
treea9dd6031479ce9585d7d0af061aa165ed9c5d49b
parent33cce6e9801f7d0184a636e9096a7cf7f8237ff9
drm: refcnt drm_framebuffer (v4.1)

This simplifies drm fb lifetime, and if the crtc/plane needs to hold
a ref to the fb when disabling a pipe until the next vblank, this
avoids the need to make disabling an overlay synchronous.  This is a
problem that shows up when userspace is using a drm plane to
implement a hw cursor.. making overlay disable synchronous causes
a performance problem when x11 is rapidly enabling/disabling the
hw cursor.  But not making it synchronous opens up a race condition
for crashing if userspace turns around and immediately deletes the
fb.  Refcnt'ing the fb makes it possible to solve this problem.

v1: original
v2: add drm_framebuffer_remove() which is called in all paths where
    fb->funcs->destroy() was directly called before.  This cleans
    up the CRTCs/planes that the fb was attached to.  You should
    only directly use drm_framebuffer_unreference() if you are also
    using drm_framebuffer_reference() to keep a ref to the fb.
v3: add comment explaining the fb refcount
v4: remove duplicate 'list_del(&fb->filp_head)'

[airlied: v4.1: fix local rejection]

Signed-off-by: Rob Clark <rob@ti.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/exynos/exynos_drm_fbdev.c
drivers/staging/omapdrm/omap_fbdev.c
include/drm/drm_crtc.h