diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 51 | 
1 files changed, 33 insertions, 18 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index a09b6b9c27d1..b86392253696 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c @@ -202,18 +202,17 @@ int amdgpu_sync_vm_fence(struct amdgpu_sync *sync, struct dma_fence *fence)   *   * @sync: sync object to add fences from reservation object to   * @resv: reservation object with embedded fence - * @explicit_sync: true if we should only sync to the exclusive fence + * @mode: how owner affects which fences we sync to + * @owner: owner of the planned job submission   *   * Sync to the fence   */ -int amdgpu_sync_resv(struct amdgpu_device *adev, -		     struct amdgpu_sync *sync, -		     struct dma_resv *resv, -		     void *owner, bool explicit_sync) +int amdgpu_sync_resv(struct amdgpu_device *adev, struct amdgpu_sync *sync, +		     struct dma_resv *resv, enum amdgpu_sync_mode mode, +		     void *owner)  {  	struct dma_resv_list *flist;  	struct dma_fence *f; -	void *fence_owner;  	unsigned i;  	int r = 0; @@ -229,30 +228,46 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,  		return r;  	for (i = 0; i < flist->shared_count; ++i) { +		void *fence_owner; +  		f = rcu_dereference_protected(flist->shared[i],  					      dma_resv_held(resv)); + +		fence_owner = amdgpu_sync_get_owner(f); + +		/* Always sync to moves, no matter what */ +		if (fence_owner == AMDGPU_FENCE_OWNER_UNDEFINED) { +			r = amdgpu_sync_fence(sync, f, false); +			if (r) +				break; +		} +  		/* We only want to trigger KFD eviction fences on  		 * evict or move jobs. Skip KFD fences otherwise.  		 */ -		fence_owner = amdgpu_sync_get_owner(f);  		if (fence_owner == AMDGPU_FENCE_OWNER_KFD &&  		    owner != AMDGPU_FENCE_OWNER_UNDEFINED)  			continue; -		if (amdgpu_sync_same_dev(adev, f)) { -			/* VM updates only sync with moves but not with user -			 * command submissions or KFD evictions fences -			 */ -			if (owner == AMDGPU_FENCE_OWNER_VM && -			    fence_owner != AMDGPU_FENCE_OWNER_UNDEFINED) +		/* Ignore fences depending on the sync mode */ +		switch (mode) { +		case AMDGPU_SYNC_ALWAYS: +			break; + +		case AMDGPU_SYNC_NE_OWNER: +			if (amdgpu_sync_same_dev(adev, f) && +			    fence_owner == owner)  				continue; +			break; -			/* Ignore fence from the same owner and explicit one as -			 * long as it isn't undefined. -			 */ -			if (owner != AMDGPU_FENCE_OWNER_UNDEFINED && -			    (fence_owner == owner || explicit_sync)) +		case AMDGPU_SYNC_EQ_OWNER: +			if (amdgpu_sync_same_dev(adev, f) && +			    fence_owner != owner)  				continue; +			break; + +		case AMDGPU_SYNC_EXPLICIT: +			continue;  		}  		r = amdgpu_sync_fence(sync, f, false);  | 
