Add a helper to access the shared fences in an reservation object. Signed-off-by: Christian König <christian.koenig at amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 7 ++----- drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 3 +-- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 4 ++-- drivers/gpu/drm/msm/msm_gem.c | 4 ++-- drivers/gpu/drm/nouveau/nouveau_fence.c | 3 +-- drivers/gpu/drm/radeon/radeon_sync.c | 3 +-- drivers/gpu/drm/ttm/ttm_bo.c | 4 +--- include/linux/reservation.h | 19 +++++++++++++++++++ 8 files changed, 29 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index fa38a960ce00..989932234160 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -238,9 +238,7 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo, for (i = 0; i < shared_count; ++i) { struct dma_fence *f; - f = rcu_dereference_protected(fobj->shared[i], - reservation_object_held(resv)); - + f = reservation_object_get_shared_fence(resv, fobj, i); if (ef) { if (f->context == ef->base.context) { dma_fence_put(f); @@ -273,8 +271,7 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo, struct dma_fence *f; struct amdgpu_amdkfd_fence *efence; - f = rcu_dereference_protected(fobj->shared[i], - reservation_object_held(resv)); + f = reservation_object_get_shared_fence(resv, fobj, i); efence = to_amdgpu_amdkfd_fence(f); if (efence) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index 2d6f5ec77a68..dbfd62ab67e4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c @@ -212,8 +212,7 @@ int amdgpu_sync_resv(struct amdgpu_device *adev, return r; for (i = 0; i < flist->shared_count; ++i) { - f = rcu_dereference_protected(flist->shared[i], - reservation_object_held(resv)); + f = reservation_object_get_shared_fence(resv, flist, i); /* We only want to trigger KFD eviction fences on * evict or move jobs. Skip KFD fences otherwise. */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index c6611cff64c8..22896a398eab 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -1482,8 +1482,8 @@ static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, flist = reservation_object_get_list(bo->resv); if (flist) { for (i = 0; i < flist->shared_count; ++i) { - f = rcu_dereference_protected(flist->shared[i], - reservation_object_held(bo->resv)); + f = reservation_object_get_shared_fence(bo->resv, + flist, i); if (amdkfd_fence_check_mm(f, current->mm)) return false; } diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index f583bb4222f9..95d25dbfde2b 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -651,8 +651,8 @@ int msm_gem_sync_object(struct drm_gem_object *obj, return 0; for (i = 0; i < fobj->shared_count; i++) { - fence = rcu_dereference_protected(fobj->shared[i], - reservation_object_held(msm_obj->resv)); + fence = reservation_object_get_shared_fence(msm_obj->resv, + fobj, i); if (fence->context != fctx->context) { ret = dma_fence_wait(fence, true); if (ret) diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c index 412d49bc6e56..3ce921c276c1 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fence.c +++ b/drivers/gpu/drm/nouveau/nouveau_fence.c @@ -376,8 +376,7 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e struct nouveau_channel *prev = NULL; bool must_wait = true; - fence = rcu_dereference_protected(fobj->shared[i], - reservation_object_held(resv)); + fence = reservation_object_get_shared_fence(resv, fobj, i); f = nouveau_local_fence(fence, chan->drm); if (f) { diff --git a/drivers/gpu/drm/radeon/radeon_sync.c b/drivers/gpu/drm/radeon/radeon_sync.c index be5d7a38d3aa..bf7f9a648838 100644 --- a/drivers/gpu/drm/radeon/radeon_sync.c +++ b/drivers/gpu/drm/radeon/radeon_sync.c @@ -110,8 +110,7 @@ int radeon_sync_resv(struct radeon_device *rdev, return r; for (i = 0; i < flist->shared_count; ++i) { - f = rcu_dereference_protected(flist->shared[i], - reservation_object_held(resv)); + f = reservation_object_get_shared_fence(resv, flist, i); fence = to_radeon_fence(f); if (fence && fence->rdev == rdev) radeon_sync_fence(sync, fence); diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 7c484729f9b2..820d97d3e8b9 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -370,9 +370,7 @@ static void ttm_bo_flush_all_fences(struct ttm_buffer_object *bo) dma_fence_enable_sw_signaling(fence); for (i = 0; fobj && i < fobj->shared_count; ++i) { - fence = rcu_dereference_protected(fobj->shared[i], - reservation_object_held(bo->resv)); - + fence = reservation_object_get_shared_fence(bo->resv, fobj, i); if (!fence->ops->signaled) dma_fence_enable_sw_signaling(fence); } diff --git a/include/linux/reservation.h b/include/linux/reservation.h index 54cf6773a14c..8a3298574bf5 100644 --- a/include/linux/reservation.h +++ b/include/linux/reservation.h @@ -140,6 +140,25 @@ reservation_object_get_list(struct reservation_object *obj) reservation_object_held(obj)); } +/** + * reservation_object_get_shared_fence - get a fence from a reservation object's + * shared fence list. + * @obj: the reservation object + * @list: the list to get the fence from + * @idx: the index in the list to get + * + * Returns the fence from the shared fence list. Does NOT take references to + * the fence. Needs to be in RCU context or the obj->lock must be held. + */ +static inline struct dma_fence * +reservation_object_get_shared_fence(struct reservation_object *obj, + struct reservation_object_list *list, + unsigned int idx) +{ + return rcu_dereference_protected(list->shared[idx], + reservation_object_held(obj)); +} + /** * reservation_object_lock - lock the reservation object * @obj: the reservation object -- 2.14.1