On Tue, Apr 12, 2016 at 09:03:06PM +0100, Chris Wilson wrote:
> For reasons unknown Sandybridge GT1 (at least) will eventually hang when
> it encounters a ring wraparound at offset 0. The test case that
> reproduces the bug reliably forces a large number of interrupted context
> switches, thereby causing very frequent ring wraparounds, but there are
> similar bug reports in the wild with the same symptoms, seqno writes
> stop just before the wrap and the ringbuffer at address 0. It is also
> timing crucial, but adding various delays hasn't helped pinpoint where
> the window lies.
> 
> Whether the fault is restricted to the ringbuffer itself or the GTT
> addressing is unclear, but moving the ringbuffer fixes all the hangs I
> have been able to reproduce.
> 
> References: (e.g.) https://bugs.freedesktop.org/show_bug.cgi?id=93262
> Testcase: igt/gem_exec_whisper/render-contexts-interruptible #snb-gt1
> Signed-off-by: Chris Wilson <[email protected]>
> Cc: [email protected]

Acked-by: Daniel Vetter <[email protected]>

> ---
>  drivers/gpu/drm/i915/intel_ringbuffer.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
> b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index 8391382431b2..904a8a276f6a 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -2096,10 +2096,12 @@ int intel_pin_and_map_ringbuffer_obj(struct 
> drm_device *dev,
>       struct drm_i915_private *dev_priv = to_i915(dev);
>       struct i915_ggtt *ggtt = &dev_priv->ggtt;
>       struct drm_i915_gem_object *obj = ringbuf->obj;
> +     /* Ring wraparound at offset 0 sometimes hangs. No idea why. */
> +     unsigned flags = PIN_OFFSET_BIAS | 4096;
>       int ret;
>  
>       if (HAS_LLC(dev_priv) && !obj->stolen) {
> -             ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, 0);
> +             ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, flags);
>               if (ret)
>                       return ret;
>  
> @@ -2113,7 +2115,8 @@ int intel_pin_and_map_ringbuffer_obj(struct drm_device 
> *dev,
>                       goto err_unpin;
>               }
>       } else {
> -             ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, PIN_MAPPABLE);
> +             ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE,
> +                                         flags | PIN_MAPPABLE);
>               if (ret)
>                       return ret;
>  
> -- 
> 2.8.0.rc3
> 
> _______________________________________________
> Intel-gfx mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to