drm_atomic_helper_shutdown() doesn't drop ref on active fb

Daniel Vetter daniel at ffwll.ch
Mon Aug 28 20:54:10 UTC 2017


On Mon, Aug 28, 2017 at 7:25 PM, Noralf Trønnes <noralf at tronnes.org> wrote:
> Hi,
>
> If I use drm_atomic_helper_shutdown() when there's no framebuffer
> active, it works fine, but if there is, it fails to drop a reference and
> drm_mode_config_cleanup() complains that there are framebuffers left.
>
> The difference between using drm_atomic_helper_shutdown() and not using
> it, is a fb put after the pipe is disabled (fb id = 33).
>
> Using drm_atomic_helper_shutdown() on device-driver unbind:
>
> [  121.543588] [drm:drm_atomic_commit] committing d6c9bd80
> [  121.543648] [drm:drm_atomic_helper_commit_modeset_disables] disabling
> [ENCODER:30:None-30]
> [  121.543671] [drm:drm_atomic_helper_commit_modeset_disables] disabling
> [CRTC:29:crtc-0]
> [  121.543719] [drm:mipi_dbi_pipe_disable [mipi_dbi]]
> [  121.543802] [drm:tinydrm_disable_backlight [tinydrm]] Backlight state:
> 0x0 -> 0x2
> [  121.543878] [drm:drm_atomic_state_default_clear] Clearing atomic state
> d6c9bd80
> [  121.543903] [drm:drm_mode_object_put] OBJ ID: 27 (5)
> [  121.543920] [drm:drm_mode_object_put] OBJ ID: 27 (4)
> [  121.543936] [drm:drm_mode_object_put] OBJ ID: 35 (1)
> [  121.543982] [drm:drm_mode_object_put] OBJ ID: 33 (3)
> [  121.543999] [drm:__drm_atomic_state_free] Freeing atomic state d6c9bd80
>
> Not using drm_atomic_helper_shutdown() and just let it tear down when
> the last file handle is closed:
>
> [   72.021160] [drm:drm_atomic_commit] committing d6a48b40
> [   72.021235] [drm:drm_atomic_helper_commit_modeset_disables] disabling
> [ENCODER:30:None-30]
> [   72.021257] [drm:drm_atomic_helper_commit_modeset_disables] disabling
> [CRTC:29:crtc-0]
> [   72.021307] [drm:mipi_dbi_pipe_disable [mipi_dbi]]
> [   72.021381] [drm:drm_mode_object_put] OBJ ID: 33 (3)
> [   72.021401] [drm:drm_atomic_state_default_clear] Clearing atomic state
> d6a48b40
> [   72.021416] [drm:drm_mode_object_put] OBJ ID: 27 (3)
> [   72.021431] [drm:drm_mode_object_put] OBJ ID: 27 (2)
> [   72.021461] [drm:drm_mode_object_put] OBJ ID: 35 (1)
> [   72.021489] [drm:drm_mode_object_put] OBJ ID: 33 (2)
> [   72.021504] [drm:__drm_atomic_state_free] Freeing atomic state d6a48b40
>
>
> More details:
>
> Calling drm_atomic_helper_shutdown():
>
> [  121.543048] [drm:drm_atomic_state_init] Allocated atomic state d6c9bd80
> [  121.543106] [drm:drm_mode_object_get] OBJ ID: 35 (1)
> [  121.543127] [drm:drm_atomic_get_crtc_state] Added [CRTC:29:crtc-0]
> d6db8400 state to d6c9bd80
> [  121.543142] [drm:drm_mode_object_put] OBJ ID: 35 (2)
> [  121.543158] [drm:drm_atomic_set_mode_prop_for_crtc] Set [NOMODE] for CRTC
> state d6db8400
> [  121.543180] [drm:drm_mode_object_get] OBJ ID: 33 (3)
> [  121.543198] [drm:drm_atomic_get_plane_state] Added [PLANE:28:plane-0]
> d6e5b180 state to d6c9bd80
> [  121.543234] [drm:drm_atomic_add_affected_connectors] Adding all current
> connectors for [CRTC:29:crtc-0] to d6c9bd80
> [  121.543262] [drm:drm_mode_object_get] OBJ ID: 27 (5)
> [  121.543276] [drm:drm_mode_object_get] OBJ ID: 27 (6)
> [  121.543294] [drm:drm_atomic_get_connector_state] Added
> [CONNECTOR:27:Virtual-1] d6e5b580 state to d6c9bd80
> [  121.543307] [drm:drm_mode_object_put] OBJ ID: 27 (7)
> [  121.543337] [drm:drm_mode_object_put] OBJ ID: 27 (6)
> [  121.543352] [drm:drm_atomic_set_crtc_for_connector] Link connector state
> d6e5b580 to [NOCRTC]
> [  121.543367] [drm:drm_atomic_set_crtc_for_plane] Link plane state d6e5b180
> to [NOCRTC]
> [  121.543379] [drm:drm_atomic_set_fb_for_plane] Set [NOFB] for plane state
> d6e5b180
> [  121.543392] [drm:drm_mode_object_put] OBJ ID: 33 (4)
> [  121.543405] [drm:drm_atomic_check_only] checking d6c9bd80
> [  121.543426] [drm:drm_atomic_helper_check_modeset] [CRTC:29:crtc-0] mode
> changed
> [  121.543438] [drm:drm_atomic_helper_check_modeset] [CRTC:29:crtc-0] enable
> changed
> [  121.543466] [drm:drm_atomic_helper_check_modeset] [CRTC:29:crtc-0] active
> changed
> [  121.543483] [drm:drm_atomic_helper_check_modeset] Updating routing for
> [CONNECTOR:27:Virtual-1]
> [  121.543495] [drm:drm_atomic_helper_check_modeset] Disabling
> [CONNECTOR:27:Virtual-1]
> [  121.543512] [drm:drm_atomic_helper_check_modeset] [CRTC:29:crtc-0] needs
> all connectors, enable: n, active: n
> [  121.543531] [drm:drm_atomic_add_affected_connectors] Adding all current
> connectors for [CRTC:29:crtc-0] to d6c9bd80
> [  121.543546] [drm:drm_mode_object_put] OBJ ID: 27 (6)
> [  121.543588] [drm:drm_atomic_commit] committing d6c9bd80
> [  121.543648] [drm:drm_atomic_helper_commit_modeset_disables] disabling
> [ENCODER:30:None-30]
> [  121.543671] [drm:drm_atomic_helper_commit_modeset_disables] disabling
> [CRTC:29:crtc-0]
> [  121.543719] [drm:mipi_dbi_pipe_disable [mipi_dbi]]
> [  121.543802] [drm:tinydrm_disable_backlight [tinydrm]] Backlight state:
> 0x0 -> 0x2
> [  121.543878] [drm:drm_atomic_state_default_clear] Clearing atomic state
> d6c9bd80
> [  121.543903] [drm:drm_mode_object_put] OBJ ID: 27 (5)
> [  121.543920] [drm:drm_mode_object_put] OBJ ID: 27 (4)
> [  121.543936] [drm:drm_mode_object_put] OBJ ID: 35 (1)
> [  121.543982] [drm:drm_mode_object_put] OBJ ID: 33 (3)
> [  121.543999] [drm:__drm_atomic_state_free] Freeing atomic state d6c9bd80
>
>
> Not using drm_atomic_helper_shutdown():
>
> [   72.020447] [drm:drm_fb_helper_fb_destroy]

I don't see your code, but from the logs it sound like you're
replacing a call for this with the shutdown helper. That will ofcourse
the references the fb helper holds. You need both calls to clean up
everything in all cases.
-Daniel

> [   72.020554] [drm:drm_mode_object_put] OBJ ID: 27 (4)
> [   72.020592] [drm:drm_mode_object_put] OBJ ID: 27 (3)
> [   72.020629] [drm:drm_atomic_state_init] Allocated atomic state d6a48b40
> [   72.020659] [drm:drm_mode_object_get] OBJ ID: 33 (3)
> [   72.020677] [drm:drm_atomic_get_plane_state] Added [PLANE:28:plane-0]
> d6aa7980 state to d6a48b40
> [   72.020716] [drm:drm_mode_object_get] OBJ ID: 35 (1)
> [   72.020736] [drm:drm_atomic_get_crtc_state] Added [CRTC:29:crtc-0]
> d77a4800 state to d6a48b40
> [   72.020757] [drm:drm_atomic_add_affected_connectors] Adding all current
> connectors for [CRTC:29:crtc-0] to d6a48b40
> [   72.020784] [drm:drm_mode_object_get] OBJ ID: 27 (3)
> [   72.020799] [drm:drm_mode_object_get] OBJ ID: 27 (4)
> [   72.020816] [drm:drm_atomic_get_connector_state] Added
> [CONNECTOR:27:Virtual-1] d6aa7380 state to d6a48b40
> [   72.020846] [drm:drm_mode_object_put] OBJ ID: 27 (5)
> [   72.020863] [drm:drm_mode_object_put] OBJ ID: 35 (2)
> [   72.020877] [drm:drm_atomic_set_mode_for_crtc] Set [NOMODE] for CRTC
> state d77a4800
> [   72.020891] [drm:drm_atomic_set_fb_for_plane] Set [NOFB] for plane state
> d6aa7980
> [   72.020905] [drm:drm_mode_object_put] OBJ ID: 33 (4)
> [   72.020918] [drm:drm_atomic_set_crtc_for_plane] Link plane state d6aa7980
> to [NOCRTC]
> [   72.020933] [drm:drm_mode_object_put] OBJ ID: 27 (4)
> [   72.020962] [drm:drm_atomic_set_crtc_for_connector] Link connector state
> d6aa7380 to [NOCRTC]
> [   72.020977] [drm:drm_atomic_check_only] checking d6a48b40
> [   72.020997] [drm:drm_atomic_helper_check_modeset] [CRTC:29:crtc-0] mode
> changed
> [   72.021010] [drm:drm_atomic_helper_check_modeset] [CRTC:29:crtc-0] enable
> changed
> [   72.021021] [drm:drm_atomic_helper_check_modeset] [CRTC:29:crtc-0] active
> changed
> [   72.021036] [drm:drm_atomic_helper_check_modeset] Updating routing for
> [CONNECTOR:27:Virtual-1]
> [   72.021048] [drm:drm_atomic_helper_check_modeset] Disabling
> [CONNECTOR:27:Virtual-1]
> [   72.021066] [drm:drm_atomic_helper_check_modeset] [CRTC:29:crtc-0] needs
> all connectors, enable: n, active: n
> [   72.021099] [drm:drm_atomic_add_affected_connectors] Adding all current
> connectors for [CRTC:29:crtc-0] to d6a48b40
> [   72.021116] [drm:drm_mode_object_put] OBJ ID: 27 (4)
> [   72.021160] [drm:drm_atomic_commit] committing d6a48b40
> [   72.021235] [drm:drm_atomic_helper_commit_modeset_disables] disabling
> [ENCODER:30:None-30]
> [   72.021257] [drm:drm_atomic_helper_commit_modeset_disables] disabling
> [CRTC:29:crtc-0]
> [   72.021307] [drm:mipi_dbi_pipe_disable [mipi_dbi]]
> [   72.021381] [drm:drm_mode_object_put] OBJ ID: 33 (3)
> [   72.021401] [drm:drm_atomic_state_default_clear] Clearing atomic state
> d6a48b40
> [   72.021416] [drm:drm_mode_object_put] OBJ ID: 27 (3)
> [   72.021431] [drm:drm_mode_object_put] OBJ ID: 27 (2)
> [   72.021461] [drm:drm_mode_object_put] OBJ ID: 35 (1)
> [   72.021489] [drm:drm_mode_object_put] OBJ ID: 33 (2)
> [   72.021504] [drm:__drm_atomic_state_free] Freeing atomic state d6a48b40
>
>
> Noralf.
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel



-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the dri-devel mailing list