drm/vc4: kms: Add missing drm_crtc_commit_put
authorMaxime Ripard <maxime@cerno.tech>
Wed, 17 Nov 2021 09:45:24 +0000 (10:45 +0100)
committerMaxime Ripard <maxime@cerno.tech>
Mon, 29 Nov 2021 14:17:54 +0000 (15:17 +0100)
Commit 9ec03d7f1ed3 ("drm/vc4: kms: Wait on previous FIFO users before a
commit") introduced a global state for the HVS, with each FIFO storing
the current CRTC commit so that we can properly synchronize commits.

However, the refcounting was off and we thus ended up leaking the
drm_crtc_commit structure every commit. Add a drm_crtc_commit_put to
prevent the leakage.

Fixes: 9ec03d7f1ed3 ("drm/vc4: kms: Wait on previous FIFO users before a commit")
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Tested-by: Jian-Hong Pan <jhp@endlessos.org>
Link: https://lore.kernel.org/r/20211117094527.146275-4-maxime@cerno.tech
drivers/gpu/drm/vc4/vc4_kms.c

index 3f780c195749c207a815adb0a30d82f188617ef4..7c1d0c3beba2e5a3a37bb9a0488bd0a530902ad2 100644 (file)
@@ -361,6 +361,7 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
                struct vc4_crtc_state *vc4_crtc_state =
                        to_vc4_crtc_state(old_crtc_state);
                unsigned int channel = vc4_crtc_state->assigned_channel;
+               struct drm_crtc_commit *commit;
                int ret;
 
                if (channel == VC4_HVS_CHANNEL_DISABLED)
@@ -369,9 +370,15 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
                if (!old_hvs_state->fifo_state[channel].in_use)
                        continue;
 
-               ret = drm_crtc_commit_wait(old_hvs_state->fifo_state[channel].pending_commit);
+               commit = old_hvs_state->fifo_state[channel].pending_commit;
+               if (!commit)
+                       continue;
+
+               ret = drm_crtc_commit_wait(commit);
                if (ret)
                        drm_err(dev, "Timed out waiting for commit\n");
+
+               drm_crtc_commit_put(commit);
        }
 
        if (vc4->hvs->hvs5)