diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2020-07-16 10:17:10 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2020-07-16 10:17:10 +0000 |
commit | 37f4565f510f507cc0efd73f248aa22d458c5479 (patch) | |
tree | 3ce2326d7244defeb36f9c55c2d73027ac4ac566 /sys | |
parent | 9ad01906fb34d3eca589e089ede6bd6bfe09e445 (diff) |
drm/i915: Also drop vm.ref along error paths for vma construction
From Chris Wilson
5e53344673fcf1df8ff52675ab0539fff26a8e29 in linux 5.7.y/5.7.9
cf1976b11372cac3b57fbae1831f66a4486355d3 in mainline linux
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/pci/drm/i915/i915_vma.c | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/sys/dev/pci/drm/i915/i915_vma.c b/sys/dev/pci/drm/i915/i915_vma.c index 6063d8e0699..ea322f38909 100644 --- a/sys/dev/pci/drm/i915/i915_vma.c +++ b/sys/dev/pci/drm/i915/i915_vma.c @@ -118,6 +118,7 @@ vma_create(struct drm_i915_gem_object *obj, struct i915_address_space *vm, const struct i915_ggtt_view *view) { + struct i915_vma *pos = ERR_PTR(-E2BIG); struct i915_vma *vma; struct rb_node *rb, **p; @@ -200,7 +201,6 @@ vma_create(struct drm_i915_gem_object *obj, rb = NULL; p = &obj->vma.tree.rb_node; while (*p) { - struct i915_vma *pos; long cmp; rb = *p; @@ -212,17 +212,12 @@ vma_create(struct drm_i915_gem_object *obj, * and dispose of ours. */ 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) p = &rb->rb_right; - else + else if (cmp > 0) p = &rb->rb_left; + else + goto err_unlock; } rb_link_node(&vma->obj_node, rb, p); rb_insert_color(&vma->obj_node, &obj->vma.tree); @@ -245,8 +240,9 @@ vma_create(struct drm_i915_gem_object *obj, err_unlock: spin_unlock(&obj->vma.lock); err_vma: + i915_vm_put(vm); i915_vma_free(vma); - return ERR_PTR(-E2BIG); + return pos; } static struct i915_vma * |