diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 48 | 
1 files changed, 32 insertions, 16 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index 95e5e93edd18..a09b6b9c27d1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c @@ -129,7 +129,8 @@ static void amdgpu_sync_keep_later(struct dma_fence **keep,   * Tries to add the fence to an existing hash entry. Returns true when an entry   * was found, false otherwise.   */ -static bool amdgpu_sync_add_later(struct amdgpu_sync *sync, struct dma_fence *f, bool explicit) +static bool amdgpu_sync_add_later(struct amdgpu_sync *sync, struct dma_fence *f, +				  bool explicit)  {  	struct amdgpu_sync_entry *e; @@ -151,19 +152,18 @@ static bool amdgpu_sync_add_later(struct amdgpu_sync *sync, struct dma_fence *f,   * amdgpu_sync_fence - remember to sync to this fence   *   * @sync: sync object to add fence to - * @fence: fence to sync to + * @f: fence to sync to + * @explicit: if this is an explicit dependency   * + * Add the fence to the sync object.   */ -int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync, -		      struct dma_fence *f, bool explicit) +int amdgpu_sync_fence(struct amdgpu_sync *sync, struct dma_fence *f, +		      bool explicit)  {  	struct amdgpu_sync_entry *e;  	if (!f)  		return 0; -	if (amdgpu_sync_same_dev(adev, f) && -	    amdgpu_sync_get_owner(f) == AMDGPU_FENCE_OWNER_VM) -		amdgpu_sync_keep_later(&sync->last_vm_update, f);  	if (amdgpu_sync_add_later(sync, f, explicit))  		return 0; @@ -180,6 +180,24 @@ int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync,  }  /** + * amdgpu_sync_vm_fence - remember to sync to this VM fence + * + * @adev: amdgpu device + * @sync: sync object to add fence to + * @fence: the VM fence to add + * + * Add the fence to the sync object and remember it as VM update. + */ +int amdgpu_sync_vm_fence(struct amdgpu_sync *sync, struct dma_fence *fence) +{ +	if (!fence) +		return 0; + +	amdgpu_sync_keep_later(&sync->last_vm_update, fence); +	return amdgpu_sync_fence(sync, fence, false); +} + +/**   * amdgpu_sync_resv - sync to a reservation object   *   * @sync: sync object to add fences from reservation object to @@ -204,7 +222,7 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,  	/* always sync to the exclusive fence */  	f = dma_resv_get_excl(resv); -	r = amdgpu_sync_fence(adev, sync, f, false); +	r = amdgpu_sync_fence(sync, f, false);  	flist = dma_resv_get_list(resv);  	if (!flist || r) @@ -222,13 +240,11 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,  			continue;  		if (amdgpu_sync_same_dev(adev, f)) { -			/* VM updates are only interesting -			 * for other VM updates and moves. +			/* VM updates only sync with moves but not with user +			 * command submissions or KFD evictions fences  			 */ -			if ((owner != AMDGPU_FENCE_OWNER_UNDEFINED) && -			    (fence_owner != AMDGPU_FENCE_OWNER_UNDEFINED) && -			    ((owner == AMDGPU_FENCE_OWNER_VM) != -			     (fence_owner == AMDGPU_FENCE_OWNER_VM))) +			if (owner == AMDGPU_FENCE_OWNER_VM && +			    fence_owner != AMDGPU_FENCE_OWNER_UNDEFINED)  				continue;  			/* Ignore fence from the same owner and explicit one as @@ -239,7 +255,7 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,  				continue;  		} -		r = amdgpu_sync_fence(adev, sync, f, false); +		r = amdgpu_sync_fence(sync, f, false);  		if (r)  			break;  	} @@ -340,7 +356,7 @@ int amdgpu_sync_clone(struct amdgpu_sync *source, struct amdgpu_sync *clone)  	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); +			r = amdgpu_sync_fence(clone, f, e->explicit);  			if (r)  				return r;  		} else { |