drm/i915: fix infinite recursion on unbind due to ilk vt-d w/a
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 6 Dec 2011 11:12:33 +0000 (12:12 +0100)
committerDave Airlie <airlied@redhat.com>
Wed, 7 Dec 2011 10:44:40 +0000 (10:44 +0000)
commiteb1711bb94991e93669c5a1b5f84f11be2d51ea1
treebd81e6b8f8c2547267e909ea2ac27bf472c15e8e
parentdc87cd5c264cb587f16459285565830689ecf7a7
drm/i915: fix infinite recursion on unbind due to ilk vt-d w/a

The recursion loop goes retire_requests->unbind->gpu_idle->retire_reqeusts.

Every time we go through this we need a
- active object that can be retired
- and there are no other references to that object than the one from
  the active list, so that it gets unbound and freed immediately.
Otherwise the recursion stops. So the recursion is only limited by the
number of objects that fit these requirements sitting in the active list
any time retire_request is called.

Issue exercised by tests/gem_unref_active_buffers from i-g-t.

There's been a decent bikeshed discussion whether it wouldn't be
better to pass around a flag, but imo this is o.k. for such a limited
case that only supports a w/a.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42180

Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Chris Wilson <chris@chris-wilson>
[ickle- we built better bikesheds, but this keeps the rain off for now]
Tested-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/i915/i915_gem.c