Re: [PATCH 2/6] dma-buf: add reservation object shared fence accessor

2018-08-10 Thread Huang Rui
On Thu, Aug 09, 2018 at 01:37:09PM +0200, Christian König wrote:
> Add a helper to access the shared fences in an reservation object.
> 
> Signed-off-by: Christian König 

Reviewed-by: Huang Rui 

> ---
>  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 = 

[PATCH 2/6] dma-buf: add reservation object shared fence accessor

2018-08-09 Thread Christian König
Add a helper to access the shared fences in an reservation object.

Signed-off-by: Christian König 
---
 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 =