• Nicholas Kazlauskas's avatar
    drm/amd/display: Fix double free during GPU reset on DC streams · 32685b32
    Nicholas Kazlauskas authored
    [Why]
    The issue only occurs during the GPU reset code path.
    
    We first backup the current state prior to commiting 0 streams
    internally from DM to DC. This state backup contains valid link
    encoder assignments.
    
    DC will clear the link encoder assignments as part of current state
    (but not the backup, since it was a copied before the commit) and
    free the extra stream reference it held.
    
    DC requires that the link encoder assignments remain cleared/invalid
    prior to commiting. Since the backup still has valid assignments we
    call the interface post reset to clear them. This routine also
    releases the extra reference that the link encoder interface held -
    resulting in a double free (and eventually a NULL pointer dereference).
    
    [How]
    We'll have to do a full DC commit anyway after GPU reset because
    the stream count previously went to 0.
    
    We don't need to retain the assignment that we had backed up, so
    just copy off of the now clean current state assignment after the
    reset has occcurred with the new link_enc_cfg_copy() interface.
    
    Fixes: 6d63fcc2 ("drm/amd/display: Reset link encoder assignments for GPU reset")
    Reviewed-by: default avatarJimmy Kizito <Jimmy.Kizito@amd.com>
    Acked-by: default avatarAlan Liu <HaoPing.Liu@amd.com>
    Signed-off-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
    Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
    Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    32685b32
amdgpu_dm.c 339 KB