drm/amd/display: wait for fence without holding reservation lock
authorChristian König <ckoenig.leichtzumerken@gmail.com>
Tue, 2 Apr 2019 14:28:13 +0000 (16:28 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 23 Apr 2019 17:09:26 +0000 (12:09 -0500)
Don't block others while waiting for the fences to finish, concurrent
submission is perfectly valid in this case and holding the lock can
prevent killed applications from terminating.

Signed-off-by: Christian König <ckoenig.leichtzumerken@gmail.com>
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index fb24898..36331e7 100644 (file)
@@ -5205,23 +5205,26 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
                        continue;
                }
 
+               abo = gem_to_amdgpu_bo(fb->obj[0]);
+
+               /* Wait for all fences on this FB */
+               r = reservation_object_wait_timeout_rcu(abo->tbo.resv, true,
+                                                       false,
+                                                       MAX_SCHEDULE_TIMEOUT);
+               WARN_ON(r < 0);
+
                /*
                 * TODO This might fail and hence better not used, wait
                 * explicitly on fences instead
                 * and in general should be called for
                 * blocking commit to as per framework helpers
                 */
-               abo = gem_to_amdgpu_bo(fb->obj[0]);
                r = amdgpu_bo_reserve(abo, true);
                if (unlikely(r != 0)) {
                        DRM_ERROR("failed to reserve buffer before flip\n");
                        WARN_ON(1);
                }
 
-               /* Wait for all fences on this FB */
-               WARN_ON(reservation_object_wait_timeout_rcu(abo->tbo.resv, true, false,
-                                                                           MAX_SCHEDULE_TIMEOUT) < 0);
-
                amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
 
                amdgpu_bo_unreserve(abo);