Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 306f98d9 authored by Michel Dänzer's avatar Michel Dänzer Committed by Alex Deucher
Browse files

drm/radeon: Complete page flip even if waiting on the BO fence fails



Otherwise the DRM core and userspace will be confused about which BO the
CRTC is scanning out.

Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarMichel Dänzer <michel.daenzer@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent c60381bd
Loading
Loading
Loading
Loading
+9 −15
Original line number Diff line number Diff line
@@ -390,19 +390,21 @@ static void radeon_flip_work_func(struct work_struct *__work)
	int r;

        down_read(&rdev->exclusive_lock);
	while (work->fence) {
	if (work->fence) {
		r = radeon_fence_wait(work->fence, false);
		if (r == -EDEADLK) {
			up_read(&rdev->exclusive_lock);
			r = radeon_gpu_reset(rdev);
			down_read(&rdev->exclusive_lock);
		}
		if (r)
			DRM_ERROR("failed to wait on page flip fence (%d)!\n", r);

		/* We continue with the page flip even if we failed to wait on
		 * the fence, otherwise the DRM core and userspace will be
		 * confused about which BO the CRTC is scanning out
		 */

		if (r) {
			DRM_ERROR("failed to wait on page flip fence (%d)!\n",
				  r);
			goto cleanup;
		} else
		radeon_fence_unref(&work->fence);
	}

@@ -418,14 +420,6 @@ static void radeon_flip_work_func(struct work_struct *__work)
	radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED;
	spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
	up_read(&rdev->exclusive_lock);

	return;

cleanup:
	drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
	radeon_fence_unref(&work->fence);
	kfree(work);
	up_read(&rdev->exclusive_lock);
}

static int radeon_crtc_page_flip(struct drm_crtc *crtc,