[Intel-gfx] [PATCH v2 3/4] drm/i915: Throttle cursor flip updates.

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Tue May 24 11:24:10 UTC 2016


Throttle after every vblank and when > 64 updates are queued, to prevent running
higher than max pin count.

For now there's no good way to do fold crtc updates, and to ensure that
we don't run out of cursor pins the best option is to throttle.

Testcase: kms_cursor_legacy
Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
Fixes: a6747b7304a9 ("drm/i915: Make unpin async.")
Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
 drivers/gpu/drm/i915/intel_display.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 21c0a2f3102b..876484270cd2 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12740,14 +12740,22 @@ static int intel_atomic_prepare_commit(struct drm_device *dev,
 		struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 		struct intel_flip_work *work;
 
-		if (!state->legacy_cursor_update) {
+		if (!state->legacy_cursor_update ||
+		    atomic_read(&intel_crtc->unpin_work_count) >= 64) {
 			ret = intel_crtc_wait_for_pending_flips(crtc, true);
 			if (ret)
 				return ret;
 
 			if (atomic_read(&intel_crtc->unpin_work_count) >= 2)
 				flush_workqueue(dev_priv->wq);
-		}
+		} else if (list_empty_careful(&intel_crtc->flip_work) &&
+			   atomic_read(&intel_crtc->unpin_work_count) >= 2)
+			/*
+			 * When running a legacy_cursor_update only load,
+			 * unpin_work may never run. Flush after a vblank
+			 * happened to ensure it does.
+			 */
+			flush_workqueue(dev_priv->wq);
 
 		/* test if we need to update something */
 		if (!needs_work(crtc_state))
-- 
2.5.5



More information about the Intel-gfx mailing list