diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 58 | 
1 files changed, 44 insertions, 14 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index 090e66a1b284..dcd8c066bc1f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c @@ -259,6 +259,14 @@ int amdgpu_sync_resv(struct amdgpu_device *adev, struct amdgpu_sync *sync,  	return 0;  } +/* Free the entry back to the slab */ +static void amdgpu_sync_entry_free(struct amdgpu_sync_entry *e) +{ +	hash_del(&e->node); +	dma_fence_put(e->fence); +	kmem_cache_free(amdgpu_sync_slab, e); +} +  /**   * amdgpu_sync_peek_fence - get the next fence not signaled yet   * @@ -280,9 +288,7 @@ struct dma_fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,  		struct drm_sched_fence *s_fence = to_drm_sched_fence(f);  		if (dma_fence_is_signaled(f)) { -			hash_del(&e->node); -			dma_fence_put(f); -			kmem_cache_free(amdgpu_sync_slab, e); +			amdgpu_sync_entry_free(e);  			continue;  		}  		if (ring && s_fence) { @@ -355,15 +361,44 @@ int amdgpu_sync_clone(struct amdgpu_sync *source, struct amdgpu_sync *clone)  			if (r)  				return r;  		} else { -			hash_del(&e->node); -			dma_fence_put(f); -			kmem_cache_free(amdgpu_sync_slab, e); +			amdgpu_sync_entry_free(e);  		}  	}  	return 0;  } +/** + * amdgpu_sync_push_to_job - push fences into job + * @sync: sync object to get the fences from + * @job: job to push the fences into + * + * Add all unsignaled fences from sync to job. + */ +int amdgpu_sync_push_to_job(struct amdgpu_sync *sync, struct amdgpu_job *job) +{ +	struct amdgpu_sync_entry *e; +	struct hlist_node *tmp; +	struct dma_fence *f; +	int i, r; + +	hash_for_each_safe(sync->fences, i, tmp, e, node) { +		f = e->fence; +		if (dma_fence_is_signaled(f)) { +			amdgpu_sync_entry_free(e); +			continue; +		} + +		dma_fence_get(f); +		r = drm_sched_job_add_dependency(&job->base, f); +		if (r) { +			dma_fence_put(f); +			return r; +		} +	} +	return 0; +} +  int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr)  {  	struct amdgpu_sync_entry *e; @@ -375,9 +410,7 @@ int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr)  		if (r)  			return r; -		hash_del(&e->node); -		dma_fence_put(e->fence); -		kmem_cache_free(amdgpu_sync_slab, e); +		amdgpu_sync_entry_free(e);  	}  	return 0; @@ -396,11 +429,8 @@ void amdgpu_sync_free(struct amdgpu_sync *sync)  	struct hlist_node *tmp;  	unsigned int i; -	hash_for_each_safe(sync->fences, i, tmp, e, node) { -		hash_del(&e->node); -		dma_fence_put(e->fence); -		kmem_cache_free(amdgpu_sync_slab, e); -	} +	hash_for_each_safe(sync->fences, i, tmp, e, node) +		amdgpu_sync_entry_free(e);  }  /** | 
