[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