[Intel-gfx] [PATCH v3 4/7] drm/i915: add support for checking if we hold an RPM reference
Chris Wilson
chris at chris-wilson.co.uk
Thu Nov 12 09:04:20 PST 2015
On Thu, Nov 12, 2015 at 06:40:18PM +0200, Imre Deak wrote:
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 825114a..ee3ef69 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -2962,6 +2962,9 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
> if (!i915.enable_hangcheck)
> return;
>
> + assert_rpm_device_not_suspended(dev_priv);
> + disable_rpm_asserts(dev_priv);
> +
> for_each_ring(ring, dev_priv, i) {
> u64 acthd;
> u32 seqno;
> @@ -3053,13 +3056,18 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
> }
> }
>
> - if (rings_hung)
> - return i915_handle_error(dev, true, "Ring hung");
> + if (rings_hung) {
> + i915_handle_error(dev, true, "Ring hung");
> + goto out;
> + }
>
> if (busy_count)
> /* Reset timer case chip hangs without another request
> * being added */
> i915_queue_hangcheck(dev);
> +
> +out:
> + enable_rpm_asserts(dev_priv);
Nice catch!
Since the rpm wakelock here is covered by
intel_mark_busy/intel_mark_idle(), we should be able to do something
like:
if (!intel_runtime_pm_tryget()
return;
where intel_runtime_pm_tryget does something like
atomic_inc_unless_zero().
Is something like that possible?
As it stands since we don't actually cancel the hangcheck when we drop
the rpm wakelock in intel_mark_idle() it can very well come to pass that
we execute this whilst the device is asleep. However, if the device is
alseep, we now that we are no longer executing.
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list