[PATCH 08/25] drm/amdgpu: add amdgpu_sync_clone

Oded Gabbay oded.gabbay at gmail.com
Sun Feb 11 12:54:16 UTC 2018


On Wed, Feb 7, 2018 at 3:32 AM, Felix Kuehling <Felix.Kuehling at amd.com> wrote:
> Cloning a sync object is useful for waiting for a sync object
> without locking the original structure indefinitely, blocking
> other threads.
>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 35 ++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h |  1 +
>  2 files changed, 36 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
> index b8d3b87..2d6f5ec 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
> @@ -322,6 +322,41 @@ struct dma_fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync, bool *explicit
>         return NULL;
>  }
>
> +/**
> + * amdgpu_sync_clone - clone a sync object
> + *
> + * @source: sync object to clone
> + * @clone: pointer to destination sync object
> + *
> + * Adds references to all unsignaled fences in @source to @clone. Also
> + * removes signaled fences from @source while at it.
> + */
> +int amdgpu_sync_clone(struct amdgpu_sync *source, struct amdgpu_sync *clone)
> +{
> +       struct amdgpu_sync_entry *e;
> +       struct hlist_node *tmp;
> +       struct dma_fence *f;
> +       int i, r;
> +
> +       hash_for_each_safe(source->fences, i, tmp, e, node) {
> +               f = e->fence;
> +               if (!dma_fence_is_signaled(f)) {
> +                       r = amdgpu_sync_fence(NULL, clone, f, e->explicit);
> +                       if (r)
> +                               return r;
> +               } else {
> +                       hash_del(&e->node);
> +                       dma_fence_put(f);
> +                       kmem_cache_free(amdgpu_sync_slab, e);
> +               }
> +       }
> +
> +       dma_fence_put(clone->last_vm_update);
> +       clone->last_vm_update = dma_fence_get(source->last_vm_update);
> +
> +       return 0;
> +}
> +
>  int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr)
>  {
>         struct amdgpu_sync_entry *e;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h
> index 7aba38d..10cf23a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h
> @@ -50,6 +50,7 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,
>  struct dma_fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
>                                      struct amdgpu_ring *ring);
>  struct dma_fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync, bool *explicit);
> +int amdgpu_sync_clone(struct amdgpu_sync *source, struct amdgpu_sync *clone);
>  int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr);
>  void amdgpu_sync_free(struct amdgpu_sync *sync);
>  int amdgpu_sync_init(void);
> --
> 2.7.4
>

This patch is:
Acked-by: Oded Gabbay <oded.gabbay at gmail.com>


More information about the amd-gfx mailing list