[PATCH] drm/atomic-helpers: Make nonblocking more resilient

Daniel Vetter daniel.vetter at ffwll.ch
Tue Feb 28 10:11:51 UTC 2017


We've switched to refcounting for the event completion, which means
there's no risk for use-after free anymore after:

commit 24835e442f289813aa568d142a755672a740503c
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Dec 21 11:23:30 2016 +0100

    drm: reference count event->completion

This should make the commit machinery a bit more resilient against
drivers bugs. It won't fix any driver bugs of course.

References: https://bugs.freedesktop.org/show_bug.cgi?id=96781
Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
---
 drivers/gpu/drm/drm_atomic_helper.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 9203f3e933f7..f68181a92210 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -1611,15 +1611,16 @@ void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *old_state)
 
 		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. */
 		ret = wait_for_completion_timeout(&commit->flip_done,
 						  10*HZ);
-		if (ret == 0)
+		if (ret == 0) {
 			DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
 				  crtc->base.id, crtc->name);
 
+			/* Unblock at least subsequent commits */
+			complete_all(&commit->flip_done);
+		}
+
 		spin_lock(&crtc->commit_lock);
 del_commit:
 		list_del(&commit->commit_entry);
-- 
2.11.0



More information about the dri-devel mailing list