diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 44 | 
1 files changed, 14 insertions, 30 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index 862eb3c1c4c5..f7d8487799b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c @@ -252,41 +252,25 @@ 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_resv_iter cursor;  	struct dma_fence *f; -	unsigned i; -	int r = 0; +	int r;  	if (resv == NULL)  		return -EINVAL; -	/* always sync to the exclusive fence */ -	f = dma_resv_excl_fence(resv); -	dma_fence_chain_for_each(f, f) { -		struct dma_fence_chain *chain = to_dma_fence_chain(f); - -		if (amdgpu_sync_test_fence(adev, mode, owner, chain ? -					   chain->fence : f)) { -			r = amdgpu_sync_fence(sync, f); -			dma_fence_put(f); -			if (r) -				return r; -			break; -		} -	} - -	flist = dma_resv_shared_list(resv); -	if (!flist) -		return 0; - -	for (i = 0; i < flist->shared_count; ++i) { -		f = rcu_dereference_protected(flist->shared[i], -					      dma_resv_held(resv)); - -		if (amdgpu_sync_test_fence(adev, mode, owner, f)) { -			r = amdgpu_sync_fence(sync, f); -			if (r) -				return r; +	dma_resv_for_each_fence(&cursor, resv, true, f) { +		dma_fence_chain_for_each(f, f) { +			struct dma_fence_chain *chain = to_dma_fence_chain(f); + +			if (amdgpu_sync_test_fence(adev, mode, owner, chain ? +						   chain->fence : f)) { +				r = amdgpu_sync_fence(sync, f); +				dma_fence_put(f); +				if (r) +					return r; +				break; +			}  		}  	}  	return 0; |