Commit ffed7bd2 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Replace open-coded wait-for loop

Now that we can pass arbitrary commands into the base __wait_for()
macro, we can reimplement the open-coded wait-for inside
i915_gem_idle_work_handler() using the new macro. This means that instead
of using ktime, we now use jiffies, and benefit from the exponential sleep
backoff that allows a fast response if the HW settles quickly.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180301103338.5380-1-chris@chris-wilson.co.uk
parent 41d3fdcd
...@@ -3417,25 +3417,22 @@ i915_gem_idle_work_handler(struct work_struct *work) ...@@ -3417,25 +3417,22 @@ i915_gem_idle_work_handler(struct work_struct *work)
container_of(work, typeof(*dev_priv), gt.idle_work.work); container_of(work, typeof(*dev_priv), gt.idle_work.work);
unsigned int epoch = I915_EPOCH_INVALID; unsigned int epoch = I915_EPOCH_INVALID;
bool rearm_hangcheck; bool rearm_hangcheck;
ktime_t end;
if (!READ_ONCE(dev_priv->gt.awake)) if (!READ_ONCE(dev_priv->gt.awake))
return; return;
/* /*
* Wait for last execlists context complete, but bail out in case a * Wait for last execlists context complete, but bail out in case a
* new request is submitted. * new request is submitted. As we don't trust the hardware, we
* continue on if the wait times out. This is necessary to allow
* the machine to suspend even if the hardware dies, and we will
* try to recover in resume (after depriving the hardware of power,
* it may be in a better mmod).
*/ */
end = ktime_add_ms(ktime_get(), I915_IDLE_ENGINES_TIMEOUT); __wait_for(if (new_requests_since_last_retire(dev_priv)) return,
do { intel_engines_are_idle(dev_priv),
if (new_requests_since_last_retire(dev_priv)) I915_IDLE_ENGINES_TIMEOUT * 1000,
return; 10, 500);
if (intel_engines_are_idle(dev_priv))
break;
usleep_range(100, 500);
} while (ktime_before(ktime_get(), end));
rearm_hangcheck = rearm_hangcheck =
cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work); cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work);
......
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