}
}
-static bool
-discard_ggtt_vma(struct i915_vma *vma, const struct i915_ggtt_view *view)
+static void discard_ggtt_vma(struct i915_vma *vma)
{
- const struct i915_ggtt_view discard = {
- .type = I915_GGTT_VIEW_PARTIAL,
- };
struct drm_i915_gem_object *obj = vma->obj;
spin_lock(&obj->vma.lock);
- if (i915_vma_compare(vma, vma->vm, &discard)) {
- struct rb_node *rb, **p;
-
+ if (!RB_EMPTY_NODE(&vma->obj_node)) {
rb_erase(&vma->obj_node, &obj->vma.tree);
- vma->ggtt_view = discard;
- GEM_BUG_ON(i915_vma_compare(vma, vma->vm, &discard));
- GEM_BUG_ON(i915_vma_compare(vma, vma->vm, view) == 0);
-
- rb = NULL;
- p = &obj->vma.tree.rb_node;
- while (*p) {
- struct i915_vma *pos;
- long cmp;
-
- rb = *p;
- pos = rb_entry(rb, struct i915_vma, obj_node);
-
- cmp = i915_vma_compare(pos, vma->vm, &discard);
- if (cmp < 0)
- p = &rb->rb_right;
- else
- p = &rb->rb_left;
- }
- rb_link_node(&vma->obj_node, rb, p);
- rb_insert_color(&vma->obj_node, &obj->vma.tree);
+ RB_CLEAR_NODE(&vma->obj_node);
}
spin_unlock(&obj->vma.lock);
-
- return i915_vma_compare(vma, vma->vm, view);
}
struct i915_vma *
}
if (i915_vma_is_pinned(vma) || i915_vma_is_active(vma)) {
- if (discard_ggtt_vma(vma, view))
- goto new_vma;
+ discard_ggtt_vma(vma);
+ goto new_vma;
}
ret = i915_vma_unbind(vma);
spin_lock(&obj->vma.lock);
list_del(&vma->obj_link);
- rb_erase(&vma->obj_node, &obj->vma.tree);
+ if (!RB_EMPTY_NODE(&vma->obj_node))
+ rb_erase(&vma->obj_node, &obj->vma.tree);
spin_unlock(&obj->vma.lock);
}