[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