[PATCH] drm/amd/display: Always get CRTC updated constant values inside commit tail

Harry Wentland harry.wentland at amd.com
Tue Nov 17 16:16:47 UTC 2020



On 2020-11-17 10:51 a.m., Rodrigo Siqueira wrote:
> We recently improved our display atomic commit and tail sequence to
> avoid some issues related to concurrency. One of the major changes
> consisted of moving the interrupt disable and the stream release from
> our atomic commit to our atomic tail (commit 6d90a208cfff
> ("drm/amd/display: Move disable interrupt into commit tail")) .
> However, the new code introduced inside our commit tail function was
> inserted right after the function
> drm_atomic_helper_update_legacy_modeset_state(), which has routines for
> updating internal data structs related to timestamps. As a result, in
> certain conditions, the display module can reach a situation where we
> update our constants and, after that, clean it. This situation generates
> the following warning:
> 
>   amdgpu 0000:03:00.0: drm_WARN_ON_ONCE(drm_drv_uses_atomic_modeset(dev))
>   WARNING: CPU: 6 PID: 1269 at drivers/gpu/drm/drm_vblank.c:722
>   drm_crtc_vblank_helper_get_vblank_timestamp_internal+0x32b/0x340 [drm]
>   ...
>   RIP:
>   0010:drm_crtc_vblank_helper_get_vblank_timestamp_internal+0x32b/0x340
>   [drm]
>   ...
>   Call Trace:
>    ? dc_stream_get_vblank_counter+0x57/0x60 [amdgpu]
>    drm_crtc_vblank_helper_get_vblank_timestamp+0x1c/0x20 [drm]
>    drm_get_last_vbltimestamp+0xad/0xc0 [drm]
>    drm_reset_vblank_timestamp+0x63/0xd0 [drm]
>    drm_crtc_vblank_on+0x85/0x150 [drm]
>    amdgpu_dm_atomic_commit_tail+0xaf1/0x2330 [amdgpu]
>    commit_tail+0x99/0x130 [drm_kms_helper]
>    drm_atomic_helper_commit+0x123/0x150 [drm_kms_helper]
>    amdgpu_dm_atomic_commit+0x11/0x20 [amdgpu]
>    drm_atomic_commit+0x4a/0x50 [drm]
>    drm_atomic_helper_set_config+0x7c/0xc0 [drm_kms_helper]
>    drm_mode_setcrtc+0x20b/0x7e0 [drm]
>    ? tomoyo_path_number_perm+0x6f/0x200
>    ? drm_mode_getcrtc+0x190/0x190 [drm]
>    drm_ioctl_kernel+0xae/0xf0 [drm]
>    drm_ioctl+0x245/0x400 [drm]
>    ? drm_mode_getcrtc+0x190/0x190 [drm]
>    amdgpu_drm_ioctl+0x4e/0x80 [amdgpu]
>    __x64_sys_ioctl+0x91/0xc0
>    do_syscall_64+0x38/0x90
>    entry_SYSCALL_64_after_hwframe+0x44/0xa9
>   ...
> 
> For fixing this issue we rely upon a refactor introduced on
> drm_atomic_helper_update_legacy_modeset_state ("Remove the timestamping
> constant update from drm_atomic_helper_update_legacy_modeset_state()")
> which decouples constant values update from
> drm_atomic_helper_update_legacy_modeset_state to a new helper.
> Basically, this commit uses this new helper and place it right after our
> release module to avoid a situation where our CRTC struct gets wrong
> values.
> 
> Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>

Good work.

Reviewed-by: Harry Wentland <harry.wentland at amd.com>

Harry

> ---
>   drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 1772adcf9f98..91f7fdeee758 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -8121,7 +8121,6 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
>   	trace_amdgpu_dm_atomic_commit_tail_begin(state);
>   
>   	drm_atomic_helper_update_legacy_modeset_state(dev, state);
> -	drm_atomic_helper_calc_timestamping_constants(state);
>   
>   	dm_state = dm_atomic_get_new_state(state);
>   	if (dm_state && dm_state->context) {
> @@ -8148,6 +8147,8 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
>   		}
>   	}
>   
> +	drm_atomic_helper_calc_timestamping_constants(state);
> +
>   	/* update changed items */
>   	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
>   		struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
> 


More information about the amd-gfx mailing list