[Intel-gfx] [PATCH] Attempt to detect and recover from pageflipping stalls

Simon Farnsworth simon.farnsworth at onelan.co.uk
Wed Sep 1 19:34:45 CEST 2010


On Wednesday 1 September 2010, Simon Farnsworth 
<simon.farnsworth at onelan.co.uk> wrote:
> In an attempt to get to the bottom of bug #29798, Chris Wilson gave me
> a patch that put some details in debugfs. With the clues gathered from
> that patch, I was able to determine that the page flip is happening,
> but that we're not seeing the IRQs we'd expect.
> 
> Work around this by only permitting a pageflip to be outstanding for 3
> VBlank periods before we start examining the display registers to see
> if the pageflip happened, but we weren't told about it. This converts
> an apparent hang into a visual glitch.
> 
And, as promised, it's buggy:

> diff --git a/drivers/gpu/drm/i915/i915_irq.c
> b/drivers/gpu/drm/i915/i915_irq.c index 16861b8..893cd77 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -887,6 +887,54 @@ static void i915_handle_error(struct drm_device *dev,
> bool wedged) queue_work(dev_priv->wq, &dev_priv->error_work);
>  }
> 
> +static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
> +{
> +	drm_i915_private_t *dev_priv = dev->dev_private;
> +	struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
> +	int plane = intel_crtc->plane;
> +	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);

These two lines got swapped when I was checking various possible null 
pointers.

I can send a new version if required.
-- 
Simon Farnsworth
Software Engineer
ONELAN Limited
http://www.onelan.com/



More information about the Intel-gfx mailing list