drm_atomic_helper_shutdown() doesn't drop ref on active fb

Noralf Trønnes noralf at tronnes.org
Mon Aug 28 17:25:05 UTC 2017


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]
[   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.



More information about the dri-devel mailing list