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 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx