Commit 03fca66b authored by Chris Wilson's avatar Chris Wilson

drm/i915: Also drop vm.ref along error paths for vma construction

Not only do we need to release the vm.ref we acquired for the vma on the
duplicate insert branch, but also for the normal error paths, so roll
them all into one.
Reported-by: default avatarAndi Shyti <andi.shyti@intel.com>
Suggested-by: default avatarAndi Shyti <andi.shyti@intel.com>
Fixes: 2850748e ("drm/i915: Pull i915_vma_pin under the vm->mutex")
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Andi Shyti <andi.shyti@intel.com>
Cc: <stable@vger.kernel.org> # v5.5+
Reviewed-by: default avatarAndi Shyti <andi.shyti@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200702211015.29604-1-chris@chris-wilson.co.uk
parent a85f2228
...@@ -104,6 +104,7 @@ vma_create(struct drm_i915_gem_object *obj, ...@@ -104,6 +104,7 @@ vma_create(struct drm_i915_gem_object *obj,
struct i915_address_space *vm, struct i915_address_space *vm,
const struct i915_ggtt_view *view) const struct i915_ggtt_view *view)
{ {
struct i915_vma *pos = ERR_PTR(-E2BIG);
struct i915_vma *vma; struct i915_vma *vma;
struct rb_node *rb, **p; struct rb_node *rb, **p;
...@@ -184,7 +185,6 @@ vma_create(struct drm_i915_gem_object *obj, ...@@ -184,7 +185,6 @@ vma_create(struct drm_i915_gem_object *obj,
rb = NULL; rb = NULL;
p = &obj->vma.tree.rb_node; p = &obj->vma.tree.rb_node;
while (*p) { while (*p) {
struct i915_vma *pos;
long cmp; long cmp;
rb = *p; rb = *p;
...@@ -196,17 +196,12 @@ vma_create(struct drm_i915_gem_object *obj, ...@@ -196,17 +196,12 @@ vma_create(struct drm_i915_gem_object *obj,
* and dispose of ours. * and dispose of ours.
*/ */
cmp = i915_vma_compare(pos, vm, view); cmp = i915_vma_compare(pos, vm, view);
if (cmp == 0) {
spin_unlock(&obj->vma.lock);
i915_vm_put(vm);
i915_vma_free(vma);
return pos;
}
if (cmp < 0) if (cmp < 0)
p = &rb->rb_right; p = &rb->rb_right;
else else if (cmp > 0)
p = &rb->rb_left; p = &rb->rb_left;
else
goto err_unlock;
} }
rb_link_node(&vma->obj_node, rb, p); rb_link_node(&vma->obj_node, rb, p);
rb_insert_color(&vma->obj_node, &obj->vma.tree); rb_insert_color(&vma->obj_node, &obj->vma.tree);
...@@ -229,8 +224,9 @@ vma_create(struct drm_i915_gem_object *obj, ...@@ -229,8 +224,9 @@ vma_create(struct drm_i915_gem_object *obj,
err_unlock: err_unlock:
spin_unlock(&obj->vma.lock); spin_unlock(&obj->vma.lock);
err_vma: err_vma:
i915_vm_put(vm);
i915_vma_free(vma); i915_vma_free(vma);
return ERR_PTR(-E2BIG); return pos;
} }
static struct i915_vma * static struct i915_vma *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment