aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c24
1 files changed, 9 insertions, 15 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index 8de579473645..97ea46597bea 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -390,20 +390,22 @@ static void radeon_flip_work_func(struct work_struct *__work)
390 int r; 390 int r;
391 391
392 down_read(&rdev->exclusive_lock); 392 down_read(&rdev->exclusive_lock);
393 while (work->fence) { 393 if (work->fence) {
394 r = radeon_fence_wait(work->fence, false); 394 r = radeon_fence_wait(work->fence, false);
395 if (r == -EDEADLK) { 395 if (r == -EDEADLK) {
396 up_read(&rdev->exclusive_lock); 396 up_read(&rdev->exclusive_lock);
397 r = radeon_gpu_reset(rdev); 397 r = radeon_gpu_reset(rdev);
398 down_read(&rdev->exclusive_lock); 398 down_read(&rdev->exclusive_lock);
399 } 399 }
400 if (r)
401 DRM_ERROR("failed to wait on page flip fence (%d)!\n", r);
400 402
401 if (r) { 403 /* We continue with the page flip even if we failed to wait on
402 DRM_ERROR("failed to wait on page flip fence (%d)!\n", 404 * the fence, otherwise the DRM core and userspace will be
403 r); 405 * confused about which BO the CRTC is scanning out
404 goto cleanup; 406 */
405 } else 407
406 radeon_fence_unref(&work->fence); 408 radeon_fence_unref(&work->fence);
407 } 409 }
408 410
409 /* do the flip (mmio) */ 411 /* do the flip (mmio) */
@@ -418,14 +420,6 @@ static void radeon_flip_work_func(struct work_struct *__work)
418 radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED; 420 radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED;
419 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 421 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
420 up_read(&rdev->exclusive_lock); 422 up_read(&rdev->exclusive_lock);
421
422 return;
423
424cleanup:
425 drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
426 radeon_fence_unref(&work->fence);
427 kfree(work);
428 up_read(&rdev->exclusive_lock);
429} 423}
430 424
431static int radeon_crtc_page_flip(struct drm_crtc *crtc, 425static int radeon_crtc_page_flip(struct drm_crtc *crtc,