aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2015-04-27 08:41:24 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-05-21 16:50:05 -0400
commite61b995841e6d165b77209c2bdf9c96ae0c16b89 (patch)
treee6d3c6b81bcd972e0958757742be1a7bc7f0f3fb
parentf5a4c67d52e42ad4e76c27287fb7e4a06e11e3fc (diff)
drm/i915: Free RPS boosts for all laggards
If the client stalls on a congested request, chosen to be 20ms old to match throttling, allow the client a free RPS boost. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> [danvet: s/rq/req/] [danvet: s/0/NULL/ reported by 0-day build] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c2
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h3
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c20
3 files changed, 19 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 289178b7e684..50e49a3d7e51 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1245,7 +1245,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
1245 jiffies + nsecs_to_jiffies_timeout((u64)*timeout) : 0; 1245 jiffies + nsecs_to_jiffies_timeout((u64)*timeout) : 0;
1246 1246
1247 if (INTEL_INFO(dev_priv)->gen >= 6) 1247 if (INTEL_INFO(dev_priv)->gen >= 6)
1248 gen6_rps_boost(dev_priv, rps); 1248 gen6_rps_boost(dev_priv, rps, req->emitted_jiffies);
1249 1249
1250 /* Record current time in case interrupted by signal, or wedged */ 1250 /* Record current time in case interrupted by signal, or wedged */
1251 trace_i915_gem_request_wait_begin(req); 1251 trace_i915_gem_request_wait_begin(req);
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 6968e7483863..e94cb6e16456 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1365,7 +1365,8 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv);
1365void gen6_rps_reset_ei(struct drm_i915_private *dev_priv); 1365void gen6_rps_reset_ei(struct drm_i915_private *dev_priv);
1366void gen6_rps_idle(struct drm_i915_private *dev_priv); 1366void gen6_rps_idle(struct drm_i915_private *dev_priv);
1367void gen6_rps_boost(struct drm_i915_private *dev_priv, 1367void gen6_rps_boost(struct drm_i915_private *dev_priv,
1368 struct intel_rps_client *rps); 1368 struct intel_rps_client *rps,
1369 unsigned long submitted);
1369void intel_queue_rps_boost_for_request(struct drm_device *dev, 1370void intel_queue_rps_boost_for_request(struct drm_device *dev,
1370 struct drm_i915_gem_request *req); 1371 struct drm_i915_gem_request *req);
1371void ilk_wm_get_hw_state(struct drm_device *dev); 1372void ilk_wm_get_hw_state(struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index b676fe81c563..6414b27692d4 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4150,10 +4150,17 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv)
4150} 4150}
4151 4151
4152void gen6_rps_boost(struct drm_i915_private *dev_priv, 4152void gen6_rps_boost(struct drm_i915_private *dev_priv,
4153 struct intel_rps_client *rps) 4153 struct intel_rps_client *rps,
4154 unsigned long submitted)
4154{ 4155{
4155 u32 val; 4156 u32 val;
4156 4157
4158 /* Force a RPS boost (and don't count it against the client) if
4159 * the GPU is severely congested.
4160 */
4161 if (rps && time_after(jiffies, submitted + msecs_to_jiffies(20)))
4162 rps = NULL;
4163
4157 mutex_lock(&dev_priv->rps.hw_lock); 4164 mutex_lock(&dev_priv->rps.hw_lock);
4158 val = dev_priv->rps.max_freq_softlimit; 4165 val = dev_priv->rps.max_freq_softlimit;
4159 if (dev_priv->rps.enabled && 4166 if (dev_priv->rps.enabled &&
@@ -6848,11 +6855,13 @@ struct request_boost {
6848static void __intel_rps_boost_work(struct work_struct *work) 6855static void __intel_rps_boost_work(struct work_struct *work)
6849{ 6856{
6850 struct request_boost *boost = container_of(work, struct request_boost, work); 6857 struct request_boost *boost = container_of(work, struct request_boost, work);
6858 struct drm_i915_gem_request *req = boost->req;
6851 6859
6852 if (!i915_gem_request_completed(boost->req, true)) 6860 if (!i915_gem_request_completed(req, true))
6853 gen6_rps_boost(to_i915(boost->req->ring->dev), NULL); 6861 gen6_rps_boost(to_i915(req->ring->dev), NULL,
6862 req->emitted_jiffies);
6854 6863
6855 i915_gem_request_unreference__unlocked(boost->req); 6864 i915_gem_request_unreference__unlocked(req);
6856 kfree(boost); 6865 kfree(boost);
6857} 6866}
6858 6867
@@ -6864,6 +6873,9 @@ void intel_queue_rps_boost_for_request(struct drm_device *dev,
6864 if (req == NULL || INTEL_INFO(dev)->gen < 6) 6873 if (req == NULL || INTEL_INFO(dev)->gen < 6)
6865 return; 6874 return;
6866 6875
6876 if (i915_gem_request_completed(req, true))
6877 return;
6878
6867 boost = kmalloc(sizeof(*boost), GFP_ATOMIC); 6879 boost = kmalloc(sizeof(*boost), GFP_ATOMIC);
6868 if (boost == NULL) 6880 if (boost == NULL)
6869 return; 6881 return;