[Intel-gfx] [PATCH] drm/i915/selftests: Extend partial vma coverage to check parallel creation

Chris Wilson chris at chris-wilson.co.uk
Thu Feb 22 09:48:40 UTC 2018


Quoting Chris Wilson (2018-01-16 10:11:43)
> One important use of partial vma is to provide mappable access to the
> object while it is being used elsewhere (pinned entirely into the
> unmappable portion of the Global GTT, i.e. for use as a display scanout).
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>

Hi Joonas, you made a request for this selftest once upon a time.
-Chris

> ---
>  drivers/gpu/drm/i915/selftests/i915_vma.c | 59 +++++++++++++++++++++++++++----
>  1 file changed, 52 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/selftests/i915_vma.c b/drivers/gpu/drm/i915/selftests/i915_vma.c
> index eb89e301b602..ea48bac16927 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_vma.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_vma.c
> @@ -606,11 +606,17 @@ static int igt_vma_partial(void *arg)
>         struct drm_i915_private *i915 = arg;
>         struct i915_address_space *vm = &i915->ggtt.base;
>         const unsigned int npages = 1021; /* prime! */
> -       struct drm_i915_gem_object *obj;
> +       struct drm_i915_gem_object *obj = NULL;
>         const struct phase {
>                 const char *name;
> +               unsigned int flags;
> +#define CREATE         BIT(0)
> +#define WHOLE          BIT(1)
>         } phases[] = {
> -               { "create" },
> +               { "create", CREATE },
> +               { "lookup" },
> +               { "whole", WHOLE },
> +               { "recreate", CREATE | WHOLE },
>                 { "lookup" },
>                 { },
>         }, *p;
> @@ -618,17 +624,44 @@ static int igt_vma_partial(void *arg)
>         struct i915_vma *vma;
>         int err = -ENOMEM;
>  
> -       /* Create lots of different VMA for the object and check that
> +       /*
> +        * Create lots of different VMA for the object and check that
>          * we are returned the same VMA when we later request the same range.
>          */
>  
> -       obj = i915_gem_object_create_internal(i915, npages*PAGE_SIZE);
> -       if (IS_ERR(obj))
> -               goto out;
> -
>         for (p = phases; p->name; p++) { /* exercise both create/lookup */
>                 unsigned int count, nvma;
>  
> +               if (p->flags & CREATE) {
> +                       if (obj)
> +                               i915_gem_object_put(obj);
> +
> +                       obj = i915_gem_object_create_internal(i915,
> +                                                             npages*PAGE_SIZE);
> +                       if (IS_ERR(obj))
> +                               goto out;
> +               }
> +
> +               if (p->flags & WHOLE) {
> +                       /*
> +                        * Make sure we can create mappable partial vma
> +                        * while the whole object is in use elsewhere.
> +                        */
> +                       vma = i915_vma_instance(obj, vm, NULL);
> +                       if (IS_ERR(vma)) {
> +                               err = PTR_ERR(vma);
> +                               goto out_object;
> +                       }
> +
> +                       err = i915_vma_unbind(vma);
> +                       if (err)
> +                               goto out_object;
> +
> +                       err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL | PIN_HIGH);
> +                       if (err)
> +                               goto out_object;
> +               }
> +
>                 nvma = 0;
>                 for_each_prime_number_from(sz, 1, npages) {
>                         for_each_prime_number_from(offset, 0, npages - sz) {
> @@ -707,12 +740,24 @@ static int igt_vma_partial(void *arg)
>                         err = -EINVAL;
>                         goto out_object;
>                 }
> +
> +               if (p->flags & WHOLE) {
> +                       vma = i915_vma_instance(obj, vm, NULL);
> +                       if (IS_ERR(vma)) {
> +                               err = PTR_ERR(vma);
> +                               goto out_object;
> +                       }
> +
> +                       i915_vma_unpin(vma);
> +               }
>         }
>  
>  out_object:
>         i915_gem_object_put(obj);
>  out:
>         return err;
> +#undef CREATE
> +#undef WHOLE
>  }
>  
>  int i915_vma_mock_selftests(void)
> -- 
> 2.15.1
> 


More information about the Intel-gfx mailing list