drm/atomic-helper: Simplify commit tracking locking
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 21 Jun 2017 09:16:27 +0000 (11:16 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 27 Jun 2017 12:02:57 +0000 (14:02 +0200)
The crtc->commit_lock only protects commit_list and commit_entry. If
we chase the pointer from the drm_atomic_state update structure, then
we don't need any locks (since we hold a reference already).

Simplify the locking accordingly.

Noticed while reviewing a patch from Boris.

Cc: Boris Brezillon <boris.brezillon@free-electrons.com>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170621091627.30837-1-daniel.vetter@ffwll.ch
drivers/gpu/drm/drm_atomic_helper.c

index 45b4f34bebcd8dee65f2ca53b6cbfaf8805216cd..c4e4e8b5caeb766beea156297de06d4052f359d4 100644 (file)
@@ -1715,9 +1715,7 @@ void drm_atomic_helper_commit_hw_done(struct drm_atomic_state *old_state)
 
                /* backend must have consumed any event by now */
                WARN_ON(new_crtc_state->event);
-               spin_lock(&crtc->commit_lock);
                complete_all(&commit->hw_done);
-               spin_unlock(&crtc->commit_lock);
        }
 }
 EXPORT_SYMBOL(drm_atomic_helper_commit_hw_done);
@@ -1746,7 +1744,6 @@ void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *old_state)
                if (WARN_ON(!commit))
                        continue;
 
-               spin_lock(&crtc->commit_lock);
                complete_all(&commit->cleanup_done);
                WARN_ON(!try_wait_for_completion(&commit->hw_done));
 
@@ -1756,8 +1753,6 @@ void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *old_state)
                if (try_wait_for_completion(&commit->flip_done))
                        goto del_commit;
 
-               spin_unlock(&crtc->commit_lock);
-
                /* We must wait for the vblank event to signal our completion
                 * before releasing our reference, since the vblank work does
                 * not hold a reference of its own. */
@@ -1767,8 +1762,8 @@ void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *old_state)
                        DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
                                  crtc->base.id, crtc->name);
 
-               spin_lock(&crtc->commit_lock);
 del_commit:
+               spin_lock(&crtc->commit_lock);
                list_del(&commit->commit_entry);
                spin_unlock(&crtc->commit_lock);
        }