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>