[Intel-gfx] [PATCH 45/46] drm/i915: Exercise manipulate of single pages in the GGTT

Matthew Auld matthew.william.auld at gmail.com
Wed Feb 8 12:25:55 UTC 2017


On 2 February 2017 at 09:09, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> Move a single page of an object around within the GGTT and check
> coherency of writes and reads.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/selftests/i915_gem_gtt.c | 91 +++++++++++++++++++++++++++
>  1 file changed, 91 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> index 7ec6fb2208a6..27e380a3bae5 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> @@ -684,6 +684,96 @@ static int igt_ggtt_drunk(void *arg)
>         return exercise_ggtt(arg, drunk_hole);
>  }
>
> +static int igt_ggtt_page(void *arg)
> +{
> +       const unsigned int count = PAGE_SIZE/sizeof(u32);
> +       I915_RND_STATE(prng);
> +       struct drm_i915_private *i915 = arg;
> +       struct i915_ggtt *ggtt = &i915->ggtt;
> +       struct drm_i915_gem_object *obj;
> +       struct drm_mm_node tmp;
> +       unsigned int *order, n;
> +       int err;
> +
> +       mutex_lock(&i915->drm.struct_mutex);
> +
> +       obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
> +       if (IS_ERR(obj)) {
> +               err = PTR_ERR(obj);
> +               goto out_unlock;
> +       }
> +
> +       err = i915_gem_object_pin_pages(obj);
> +       if (err)
> +               goto out_free;
> +
> +       memset(&tmp, 0, sizeof(tmp));
> +       err = drm_mm_insert_node_in_range(&ggtt->base.mm, &tmp,
> +                                         1024 * PAGE_SIZE, 0,
> +                                         I915_COLOR_UNEVICTABLE,
> +                                         0, ggtt->mappable_end,
> +                                         DRM_MM_INSERT_LOW);
> +       if (err)
> +               goto out_unpin;
> +
> +       order = i915_random_order(count, &prng);
> +       if (!order) {
> +               err = -ENOMEM;
> +               goto out_remove;
> +       }
> +
> +       for (n = 0; n < count; n++) {
> +               u64 offset = tmp.start + order[n] * PAGE_SIZE;
> +               u32 __iomem *vaddr;
> +
> +               ggtt->base.insert_page(&ggtt->base,
> +                                      i915_gem_object_get_dma_address(obj, 0),
> +                                      offset, I915_CACHE_NONE, 0);
Forgive my ignorance but don't we need a write barrier here also?

Reviewed-by: Matthew Auld <matthew.auld at intel.com>


More information about the Intel-gfx mailing list