drm/amdgpu: add amdgpu_sync_clone
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@amd.com> Acked-by: Oded Gabbay <oded.gabbay@gmail.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
This commit is contained in:
Родитель
155494dbbb
Коммит
3c728d3aa1
|
@ -322,6 +322,41 @@ struct dma_fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync, bool *explicit
|
||||||
return NULL;
|
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)
|
int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr)
|
||||||
{
|
{
|
||||||
struct amdgpu_sync_entry *e;
|
struct amdgpu_sync_entry *e;
|
||||||
|
|
|
@ -50,6 +50,7 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,
|
||||||
struct dma_fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
|
struct dma_fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
|
||||||
struct amdgpu_ring *ring);
|
struct amdgpu_ring *ring);
|
||||||
struct dma_fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync, bool *explicit);
|
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);
|
int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr);
|
||||||
void amdgpu_sync_free(struct amdgpu_sync *sync);
|
void amdgpu_sync_free(struct amdgpu_sync *sync);
|
||||||
int amdgpu_sync_init(void);
|
int amdgpu_sync_init(void);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче