Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> writes: > Across the many users of the GGTT vma (internal objects, mmapings, > display etc), we may end up with conflicting requirements for the > placement. Currently, we try to resolve the conflict by unbinding the > vma and rebinding it to match the new constraints; over time we will end > up with a GGTT that matches the most strict constraints over all > concurrent users. However, this causes a problem if the vma is currently > in use as we must wait until it is idle before moving it. But there is > no restriction on the number of views we may (apart from the limited we may...have/impose? -Mika > size of the GGTT itself), and so if the active vma does not meet our > requirements, try and build a new one! > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_gem.c | 44 +++++++++++++++++++++++++++++++++ > 1 file changed, 44 insertions(+) > > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > index 0cbcb9f54e7d..29a4594ddef2 100644 > --- a/drivers/gpu/drm/i915/i915_gem.c > +++ b/drivers/gpu/drm/i915/i915_gem.c > @@ -933,6 +933,44 @@ void i915_gem_runtime_suspend(struct drm_i915_private *i915) > } > } > > +static bool > +discard_ggtt_vma(struct i915_vma *vma, const struct i915_ggtt_view *view) > +{ > + 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; > + > + rb_erase(&vma->obj_node, &obj->vma.tree); > + vma->ggtt_view = discard; > + > + 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); > + } > + spin_unlock(&obj->vma.lock); > + > + return i915_vma_compare(vma, vma->vm, view); > +} > + > struct i915_vma * > i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj, > const struct i915_ggtt_view *view, > @@ -979,6 +1017,7 @@ i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj, > return ERR_PTR(-ENOSPC); > } > > +new_vma: > vma = i915_vma_instance(obj, &ggtt->vm, view); > if (IS_ERR(vma)) > return vma; > @@ -993,6 +1032,11 @@ i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj, > return ERR_PTR(-ENOSPC); > } > > + if (i915_vma_is_pinned(vma) || i915_vma_is_active(vma)) { > + if (discard_ggtt_vma(vma, view)) > + goto new_vma; > + } > + > ret = i915_vma_unbind(vma); > if (ret) > return ERR_PTR(ret); > -- > 2.20.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx