[Intel-gfx] [PATCH 08/11] drm/i915/gt: Only wait for GPU activity before unbinding a GGTT fence

Matthew Auld matthew.william.auld at gmail.com
Wed Apr 1 18:56:23 UTC 2020


On Tue, 31 Mar 2020 at 22:31, Chris Wilson <chris at chris-wilson.co.uk> wrote:
>
> Only GPU activity via the GGTT fence is asynchronous, we know that we
> control the CPU access directly, so we only need to wait for the GPU to
> stop using the fence before we relinquish it.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c | 12 ++++++++----
>  drivers/gpu/drm/i915/gt/intel_ggtt_fencing.h |  3 +++
>  drivers/gpu/drm/i915/i915_vma.c              |  4 ++++
>  3 files changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c b/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
> index 225970f4a4ef..74f8201486b2 100644
> --- a/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
> +++ b/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
> @@ -239,15 +239,18 @@ static int fence_update(struct i915_fence_reg *fence,
>                 if (!i915_vma_is_map_and_fenceable(vma))
>                         return -EINVAL;
>
> -               ret = i915_vma_sync(vma);
> -               if (ret)
> -                       return ret;
> +               if (INTEL_GEN(fence_to_i915(fence)) < 4) {
> +                       /* implicit 'unfenced' GPU blits */
> +                       ret = i915_vma_sync(vma);

What was the strangeness with gen < 4 again?

> +                       if (ret)
> +                               return ret;
> +               }
>         }
>
>         old = xchg(&fence->vma, NULL);
>         if (old) {
>                 /* XXX Ideally we would move the waiting to outside the mutex */
> -               ret = i915_vma_sync(old);
> +               ret = i915_active_wait(&fence->active);
>                 if (ret) {
>                         fence->vma = old;
>                         return ret;
> @@ -869,6 +872,7 @@ void intel_ggtt_init_fences(struct i915_ggtt *ggtt)
>         for (i = 0; i < num_fences; i++) {
>                 struct i915_fence_reg *fence = &ggtt->fence_regs[i];
>
> +               i915_active_init(&fence->active, NULL, NULL);

Some active_fini?

>                 fence->ggtt = ggtt;
>                 fence->id = i;
>                 list_add_tail(&fence->link, &ggtt->fence_list);
> diff --git a/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.h b/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.h
> index 9850f6a85d2a..08c6bb667581 100644
> --- a/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.h
> +++ b/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.h
> @@ -28,6 +28,8 @@
>  #include <linux/list.h>
>  #include <linux/types.h>
>
> +#include "i915_active.h"
> +
>  struct drm_i915_gem_object;
>  struct i915_ggtt;
>  struct i915_vma;
> @@ -41,6 +43,7 @@ struct i915_fence_reg {
>         struct i915_ggtt *ggtt;
>         struct i915_vma *vma;
>         atomic_t pin_count;
> +       struct i915_active active;
>         int id;
>         /**
>          * Whether the tiling parameters for the currently
> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
> index 18069df2a9e5..616ca5a7c875 100644
> --- a/drivers/gpu/drm/i915/i915_vma.c
> +++ b/drivers/gpu/drm/i915/i915_vma.c
> @@ -1232,6 +1232,10 @@ int i915_vma_move_to_active(struct i915_vma *vma,
>                 dma_resv_add_shared_fence(vma->resv, &rq->fence);
>                 obj->write_domain = 0;
>         }
> +
> +       if (flags & EXEC_OBJECT_NEEDS_FENCE && vma->fence)
> +               i915_active_add_request(&vma->fence->active, rq);
> +
>         obj->read_domains |= I915_GEM_GPU_DOMAINS;
>         obj->mm.dirty = true;
>
> --
> 2.20.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list