• Archit Taneja's avatar
    drm/omap: Take a fb reference in omap_plane_update() · b03e14fd
    Archit Taneja authored
    When userspace calls SET_PLANE ioctl, drm core takes a reference of the fb and
    passes control to the update_plane op defined by the drm driver.
    
    In omapdrm, we have a worker thread which queues framebuffers objects received
    from update_plane and displays them at the appropriate time.
    
    It is possible that the framebuffer is destoryed by userspace between the time
    of calling the ioctl and apply-worker being scheduled. If this happens, the
    apply-worker holds a pointer to a framebuffer which is already destroyed.
    
    Take an extra refernece/unreference of the fb in omap_plane_update() to prevent
    this from happening. A reference is taken of the fb passed to update_plane(),
    the previous framebuffer (held by plane->fb) is unreferenced. This will prevent
    drm from destroying the framebuffer till the time it's unreferenced by the
    apply-worker.
    
    This is in addition to the exisitng reference/unreference in update_pin(),
    which is taken for the scanout of the plane's current framebuffer, and an
    unreference the previous framebuffer.
    Signed-off-by: default avatarArchit Taneja <archit@ti.com>
    Reviewed-by: default avatarRob Clark <robdclark@gmail.com>
    Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
    b03e14fd
omap_plane.c 11.7 KB