diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2015-04-27 08:41:24 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-05-21 16:50:05 -0400 |
commit | e61b995841e6d165b77209c2bdf9c96ae0c16b89 (patch) | |
tree | e6d3c6b81bcd972e0958757742be1a7bc7f0f3fb | |
parent | f5a4c67d52e42ad4e76c27287fb7e4a06e11e3fc (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.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 20 |
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); | |||
1365 | void gen6_rps_reset_ei(struct drm_i915_private *dev_priv); | 1365 | void gen6_rps_reset_ei(struct drm_i915_private *dev_priv); |
1366 | void gen6_rps_idle(struct drm_i915_private *dev_priv); | 1366 | void gen6_rps_idle(struct drm_i915_private *dev_priv); |
1367 | void gen6_rps_boost(struct drm_i915_private *dev_priv, | 1367 | void 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); | ||
1369 | void intel_queue_rps_boost_for_request(struct drm_device *dev, | 1370 | void intel_queue_rps_boost_for_request(struct drm_device *dev, |
1370 | struct drm_i915_gem_request *req); | 1371 | struct drm_i915_gem_request *req); |
1371 | void ilk_wm_get_hw_state(struct drm_device *dev); | 1372 | void 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 | ||
4152 | void gen6_rps_boost(struct drm_i915_private *dev_priv, | 4152 | void 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 { | |||
6848 | static void __intel_rps_boost_work(struct work_struct *work) | 6855 | static 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; |