diff mbox

drm/i915/selftests: Extend partial vma coverage to check parallel creation

Message ID 20180116101143.18481-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show

Commit Message

Chris Wilson Jan. 16, 2018, 10:11 a.m. UTC
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@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
---
 drivers/gpu/drm/i915/selftests/i915_vma.c | 59 +++++++++++++++++++++++++++----
 1 file changed, 52 insertions(+), 7 deletions(-)

Comments

Chris Wilson Feb. 22, 2018, 9:48 a.m. UTC | #1
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@chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen@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
>
Joonas Lahtinen March 5, 2018, 2:28 p.m. UTC | #2
+ 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@chris-wilson.co.uk>
> > Cc: Joonas Lahtinen <joonas.lahtinen@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
> >
diff mbox

Patch

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)