drm/amd/display: Spinlock before reading event
authorAlex Hung <alex.hung@amd.com>
Fri, 26 Apr 2024 16:33:47 +0000 (10:33 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 2 May 2024 20:18:18 +0000 (16:18 -0400)
[WHY & HOW]
A read of acrtc_attach->base.state->event was not locked so moving it
inside the spinlock.

This fixes a LOCK_EVASION issue reported by Coverity.

Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index bcb6030..ee8da59 100644 (file)
@@ -8806,15 +8806,13 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
                                bundle->stream_update.vrr_infopacket =
                                        &acrtc_state->stream->vrr_infopacket;
                }
-       } else if (cursor_update && acrtc_state->active_planes > 0 &&
-                  acrtc_attach->base.state->event) {
-               drm_crtc_vblank_get(pcrtc);
-
+       } else if (cursor_update && acrtc_state->active_planes > 0) {
                spin_lock_irqsave(&pcrtc->dev->event_lock, flags);
-
-               acrtc_attach->event = acrtc_attach->base.state->event;
-               acrtc_attach->base.state->event = NULL;
-
+               if (acrtc_attach->base.state->event) {
+                       drm_crtc_vblank_get(pcrtc);
+                       acrtc_attach->event = acrtc_attach->base.state->event;
+                       acrtc_attach->base.state->event = NULL;
+               }
                spin_unlock_irqrestore(&pcrtc->dev->event_lock, flags);
        }