]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/display: Fix handling of plane refcount
authorJoshua Aberback <joshua.aberback@amd.com>
Mon, 28 Oct 2024 21:12:22 +0000 (17:12 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 20 Nov 2024 14:39:36 +0000 (09:39 -0500)
[Why]
The mechanism to backup and restore plane states doesn't maintain
refcount, which can cause issues if the refcount of the plane changes
in between backup and restore operations, such as memory leaks if the
refcount was supposed to go down, or double frees / invalid memory
accesses if the refcount was supposed to go up.

[How]
Cache and re-apply current refcount when restoring plane states.

Cc: stable@vger.kernel.org
Reviewed-by: Josip Pavic <josip.pavic@amd.com>
Signed-off-by: Joshua Aberback <joshua.aberback@amd.com>
Signed-off-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c

index 7872c6cabb14c3aa6819c034c9fd05255b335d0d..0c1875d35a95d742212183fa40b01be1bedda80f 100644 (file)
@@ -3141,7 +3141,10 @@ static void restore_planes_and_stream_state(
                return;
 
        for (i = 0; i < status->plane_count; i++) {
+               /* refcount will always be valid, restore everything else */
+               struct kref refcount = status->plane_states[i]->refcount;
                *status->plane_states[i] = scratch->plane_states[i];
+               status->plane_states[i]->refcount = refcount;
        }
        *stream = scratch->stream_state;
 }