drm/i915: First recheck for an empty fence register.
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 11 Feb 2009 14:26:44 +0000 (14:26 +0000)
committerEric Anholt <eric@anholt.net>
Wed, 11 Mar 2009 03:22:24 +0000 (20:22 -0700)
If we wait upon a request and successfully unbind a buffer occupying a
fence register, then that slot will be freed and cause a NULL derefrence
upon rescanning.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Eric Anholt <eric@anholt.net>
drivers/gpu/drm/i915/i915_gem.c

index c94069b..6497c1a 100644 (file)
@@ -1580,6 +1580,7 @@ i915_gem_object_get_fence_reg(struct drm_gem_object *obj, bool write)
        }
 
        /* First try to find a free reg */
+try_again:
        for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) {
                reg = &dev_priv->fence_regs[i];
                if (!reg->obj)
@@ -1591,7 +1592,6 @@ i915_gem_object_get_fence_reg(struct drm_gem_object *obj, bool write)
                struct drm_i915_gem_object *old_obj_priv = NULL;
                loff_t offset;
 
-try_again:
                /* Could try to use LRU here instead... */
                for (i = dev_priv->fence_reg_start;
                     i < dev_priv->num_fence_regs; i++) {