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

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Mon Mar 5 14:28:31 UTC 2018


+ Abdiel

Quoting Chris Wilson (2018-02-22 11:48:40)
> 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