Commit e61b9958 authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
[danvet: s/rq/req/]
[danvet: s/0/NULL/ reported by 0-day build]
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent f5a4c67d
...@@ -1245,7 +1245,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req, ...@@ -1245,7 +1245,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
jiffies + nsecs_to_jiffies_timeout((u64)*timeout) : 0; jiffies + nsecs_to_jiffies_timeout((u64)*timeout) : 0;
if (INTEL_INFO(dev_priv)->gen >= 6) if (INTEL_INFO(dev_priv)->gen >= 6)
gen6_rps_boost(dev_priv, rps); gen6_rps_boost(dev_priv, rps, req->emitted_jiffies);
/* Record current time in case interrupted by signal, or wedged */ /* Record current time in case interrupted by signal, or wedged */
trace_i915_gem_request_wait_begin(req); trace_i915_gem_request_wait_begin(req);
......
...@@ -1365,7 +1365,8 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv); ...@@ -1365,7 +1365,8 @@ void gen6_rps_busy(struct drm_i915_private *dev_priv);
void gen6_rps_reset_ei(struct drm_i915_private *dev_priv); void gen6_rps_reset_ei(struct drm_i915_private *dev_priv);
void gen6_rps_idle(struct drm_i915_private *dev_priv); void gen6_rps_idle(struct drm_i915_private *dev_priv);
void gen6_rps_boost(struct drm_i915_private *dev_priv, void gen6_rps_boost(struct drm_i915_private *dev_priv,
struct intel_rps_client *rps); struct intel_rps_client *rps,
unsigned long submitted);
void intel_queue_rps_boost_for_request(struct drm_device *dev, void intel_queue_rps_boost_for_request(struct drm_device *dev,
struct drm_i915_gem_request *req); struct drm_i915_gem_request *req);
void ilk_wm_get_hw_state(struct drm_device *dev); void ilk_wm_get_hw_state(struct drm_device *dev);
......
...@@ -4150,10 +4150,17 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv) ...@@ -4150,10 +4150,17 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv)
} }
void gen6_rps_boost(struct drm_i915_private *dev_priv, void gen6_rps_boost(struct drm_i915_private *dev_priv,
struct intel_rps_client *rps) struct intel_rps_client *rps,
unsigned long submitted)
{ {
u32 val; u32 val;
/* Force a RPS boost (and don't count it against the client) if
* the GPU is severely congested.
*/
if (rps && time_after(jiffies, submitted + msecs_to_jiffies(20)))
rps = NULL;
mutex_lock(&dev_priv->rps.hw_lock); mutex_lock(&dev_priv->rps.hw_lock);
val = dev_priv->rps.max_freq_softlimit; val = dev_priv->rps.max_freq_softlimit;
if (dev_priv->rps.enabled && if (dev_priv->rps.enabled &&
...@@ -6848,11 +6855,13 @@ struct request_boost { ...@@ -6848,11 +6855,13 @@ struct request_boost {
static void __intel_rps_boost_work(struct work_struct *work) static void __intel_rps_boost_work(struct work_struct *work)
{ {
struct request_boost *boost = container_of(work, struct request_boost, work); struct request_boost *boost = container_of(work, struct request_boost, work);
struct drm_i915_gem_request *req = boost->req;
if (!i915_gem_request_completed(boost->req, true)) if (!i915_gem_request_completed(req, true))
gen6_rps_boost(to_i915(boost->req->ring->dev), NULL); gen6_rps_boost(to_i915(req->ring->dev), NULL,
req->emitted_jiffies);
i915_gem_request_unreference__unlocked(boost->req); i915_gem_request_unreference__unlocked(req);
kfree(boost); kfree(boost);
} }
...@@ -6864,6 +6873,9 @@ void intel_queue_rps_boost_for_request(struct drm_device *dev, ...@@ -6864,6 +6873,9 @@ void intel_queue_rps_boost_for_request(struct drm_device *dev,
if (req == NULL || INTEL_INFO(dev)->gen < 6) if (req == NULL || INTEL_INFO(dev)->gen < 6)
return; return;
if (i915_gem_request_completed(req, true))
return;
boost = kmalloc(sizeof(*boost), GFP_ATOMIC); boost = kmalloc(sizeof(*boost), GFP_ATOMIC);
if (boost == NULL) if (boost == NULL)
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment