• Daniel Vetter's avatar
    drm: push modeset_lock_all into ->fb_create driver callbacks · 468174f7
    Daniel Vetter authored
    And drop it where it's not needed. Most driver just lookup the gem
    object, allocate an fb struct, fill in all the useful fields and then
    register it with drm_framebuffer_init.
    
    All of these operations are already separately locked, and since we
    only put the fb into the fpriv->fbs list _after_ having called
    ->fb_create, we can't also race with rmfb. We can otoh race with other
    ioctls that put the framebuffer to use, but all drivers have been
    reorganized already to call drm_framebuffer_init last in the fb
    creation sequence.
    
    So essentially, we can completely remove any modeset locks from the
    addfb ioctl paths. Yeah!
    
    Also, reference-counting is solid - we get a reference from fb_create
    which we transfer to the fpriv->fbs list. And after unlocking the
    fpriv->fbs_lock we don't touch the framebuffer any longer. Furthermore
    drm_framebuffer_init has added a 2nd reference for the idr lookup, and
    any access through that table will do it's own refcounting.
    Reviewed-by: default avatarRob Clark <rob@ti.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    468174f7
drm_crtc.c 102 KB