Commit 7141fd3e authored by Daniel Vetter's avatar Daniel Vetter

drm/atomic-helper: Simplify commit tracking locking

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: default avatarSean Paul <seanpaul@chromium.org>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170621091627.30837-1-daniel.vetter@ffwll.ch
parent 5f58e974
...@@ -1715,9 +1715,7 @@ void drm_atomic_helper_commit_hw_done(struct drm_atomic_state *old_state) ...@@ -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 */ /* backend must have consumed any event by now */
WARN_ON(new_crtc_state->event); WARN_ON(new_crtc_state->event);
spin_lock(&crtc->commit_lock);
complete_all(&commit->hw_done); complete_all(&commit->hw_done);
spin_unlock(&crtc->commit_lock);
} }
} }
EXPORT_SYMBOL(drm_atomic_helper_commit_hw_done); 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) ...@@ -1746,7 +1744,6 @@ void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *old_state)
if (WARN_ON(!commit)) if (WARN_ON(!commit))
continue; continue;
spin_lock(&crtc->commit_lock);
complete_all(&commit->cleanup_done); complete_all(&commit->cleanup_done);
WARN_ON(!try_wait_for_completion(&commit->hw_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) ...@@ -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)) if (try_wait_for_completion(&commit->flip_done))
goto del_commit; goto del_commit;
spin_unlock(&crtc->commit_lock);
/* We must wait for the vblank event to signal our completion /* We must wait for the vblank event to signal our completion
* before releasing our reference, since the vblank work does * before releasing our reference, since the vblank work does
* not hold a reference of its own. */ * not hold a reference of its own. */
...@@ -1767,8 +1762,8 @@ void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *old_state) ...@@ -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", DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
crtc->base.id, crtc->name); crtc->base.id, crtc->name);
spin_lock(&crtc->commit_lock);
del_commit: del_commit:
spin_lock(&crtc->commit_lock);
list_del(&commit->commit_entry); list_del(&commit->commit_entry);
spin_unlock(&crtc->commit_lock); spin_unlock(&crtc->commit_lock);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment