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 <chris@xxxxxxxxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx Acked-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > --- > 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 > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html