[RFC 09/10] drm/i915/vm_bind: Skip vma_lookup for persistent vmas
Thomas Hellström
thomas.hellstrom at linux.intel.com
Tue Jul 5 08:57:17 UTC 2022
On Fri, 2022-07-01 at 15:50 -0700, Niranjana Vishwanathapura wrote:
> vma_lookup is tied to segment of the object instead of section
> of VA space. Hence, it do not support aliasing (ie., multiple
> bindings to the same section of the object).
> Skip vma_lookup for persistent vmas as it supports aliasing.
>
> Signed-off-by: Niranjana Vishwanathapura
> <niranjana.vishwanathapura at intel.com>
> ---
> drivers/gpu/drm/i915/i915_vma.c | 19 ++++++++++++++-----
> 1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_vma.c
> b/drivers/gpu/drm/i915/i915_vma.c
> index 6adb013579be..9aa38b772b5b 100644
> --- a/drivers/gpu/drm/i915/i915_vma.c
> +++ b/drivers/gpu/drm/i915/i915_vma.c
> @@ -197,6 +197,10 @@ vma_create(struct drm_i915_gem_object *obj,
> __set_bit(I915_VMA_GGTT_BIT, __i915_vma_flags(vma));
> }
>
> + if (!i915_vma_is_ggtt(vma) &&
> + (view && view->type == I915_GGTT_VIEW_PARTIAL))
> + goto skip_rb_insert;
> +
Rather than guessing that a vma with this signature is a persistent
vma, which is confusing to the reader, could we have an argument saying
we want to create a persistent vma?
> rb = NULL;
> p = &obj->vma.tree.rb_node;
> while (*p) {
> @@ -221,6 +225,7 @@ vma_create(struct drm_i915_gem_object *obj,
> rb_link_node(&vma->obj_node, rb, p);
> rb_insert_color(&vma->obj_node, &obj->vma.tree);
>
> +skip_rb_insert:
> if (i915_vma_is_ggtt(vma))
> /*
> * We put the GGTT vma at the start of the vma-list,
> followed
> @@ -292,13 +297,16 @@ i915_vma_instance(struct drm_i915_gem_object
> *obj,
> struct i915_address_space *vm,
> const struct i915_ggtt_view *view)
> {
> - struct i915_vma *vma;
> + struct i915_vma *vma = NULL;
>
> GEM_BUG_ON(!kref_read(&vm->ref));
>
> - spin_lock(&obj->vma.lock);
> - vma = i915_vma_lookup(obj, vm, view);
> - spin_unlock(&obj->vma.lock);
> + if (i915_is_ggtt(vm) || !view ||
> + view->type != I915_GGTT_VIEW_PARTIAL) {
Same here?
/Thomas
> + spin_lock(&obj->vma.lock);
> + vma = i915_vma_lookup(obj, vm, view);
> + spin_unlock(&obj->vma.lock);
> + }
>
> /* vma_create() will resolve the race if another creates the
> vma */
> if (unlikely(!vma))
> @@ -1670,7 +1678,8 @@ static void release_references(struct i915_vma
> *vma, bool vm_ddestroy)
>
> spin_lock(&obj->vma.lock);
> list_del(&vma->obj_link);
> - if (!RB_EMPTY_NODE(&vma->obj_node))
> + if (!i915_vma_is_persistent(vma) &&
> + !RB_EMPTY_NODE(&vma->obj_node))
> rb_erase(&vma->obj_node, &obj->vma.tree);
>
> spin_unlock(&obj->vma.lock);
More information about the dri-devel
mailing list