[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