Reviewed By: Harish Kasiviswanathan <harish.kasiviswanat...@amd.com>

On 2019-02-08 4:21 p.m., Kuehling, Felix wrote:
> Temporarily removing eviction fences to avoid triggering them by
> accident is no longer necessary due to the fence_owner logic in
> amdgpu_sync_resv.
>
> As a result the ef_list usage of amdgpu_amdkfd_remove_eviction_fence
> and amdgpu_amdkfd_add_eviction_fence are no longer needed.
>
> Signed-off-by: Felix Kuehling <felix.kuehl...@amd.com>
> Acked-by: Christian König <christian.koe...@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 134 
> ++---------------------
>   1 file changed, 11 insertions(+), 123 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> index 44a1581..1921dec3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> @@ -204,38 +204,25 @@ void amdgpu_amdkfd_unreserve_memory_limit(struct 
> amdgpu_bo *bo)
>   }
>   
>   
> -/* amdgpu_amdkfd_remove_eviction_fence - Removes eviction fence(s) from BO's
> +/* amdgpu_amdkfd_remove_eviction_fence - Removes eviction fence from BO's
>    *  reservation object.
>    *
>    * @bo: [IN] Remove eviction fence(s) from this BO
> - * @ef: [IN] If ef is specified, then this eviction fence is removed if it
> + * @ef: [IN] This eviction fence is removed if it
>    *  is present in the shared list.
> - * @ef_list: [OUT] Returns list of eviction fences. These fences are removed
> - *  from BO's reservation object shared list.
> - * @ef_count: [OUT] Number of fences in ef_list.
>    *
> - * NOTE: If called with ef_list, then amdgpu_amdkfd_add_eviction_fence must 
> be
> - *  called to restore the eviction fences and to avoid memory leak. This is
> - *  useful for shared BOs.
>    * NOTE: Must be called with BO reserved i.e. bo->tbo.resv->lock held.
>    */
>   static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo,
> -                                     struct amdgpu_amdkfd_fence *ef,
> -                                     struct amdgpu_amdkfd_fence ***ef_list,
> -                                     unsigned int *ef_count)
> +                                     struct amdgpu_amdkfd_fence *ef)
>   {
>       struct reservation_object *resv = bo->tbo.resv;
>       struct reservation_object_list *old, *new;
>       unsigned int i, j, k;
>   
> -     if (!ef && !ef_list)
> +     if (!ef)
>               return -EINVAL;
>   
> -     if (ef_list) {
> -             *ef_list = NULL;
> -             *ef_count = 0;
> -     }
> -
>       old = reservation_object_get_list(resv);
>       if (!old)
>               return 0;
> @@ -254,8 +241,7 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct 
> amdgpu_bo *bo,
>               f = rcu_dereference_protected(old->shared[i],
>                                             reservation_object_held(resv));
>   
> -             if ((ef && f->context == ef->base.context) ||
> -                 (!ef && to_amdgpu_amdkfd_fence(f)))
> +             if (f->context == ef->base.context)
>                       RCU_INIT_POINTER(new->shared[--j], f);
>               else
>                       RCU_INIT_POINTER(new->shared[k++], f);
> @@ -263,21 +249,6 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct 
> amdgpu_bo *bo,
>       new->shared_max = old->shared_max;
>       new->shared_count = k;
>   
> -     if (!ef) {
> -             unsigned int count = old->shared_count - j;
> -
> -             /* Alloc memory for count number of eviction fence pointers.
> -              * Fill the ef_list array and ef_count
> -              */
> -             *ef_list = kcalloc(count, sizeof(**ef_list), GFP_KERNEL);
> -             *ef_count = count;
> -
> -             if (!*ef_list) {
> -                     kfree(new);
> -                     return -ENOMEM;
> -             }
> -     }
> -
>       /* Install the new fence list, seqcount provides the barriers */
>       preempt_disable();
>       write_seqcount_begin(&resv->seq);
> @@ -291,46 +262,13 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct 
> amdgpu_bo *bo,
>   
>               f = rcu_dereference_protected(new->shared[i],
>                                             reservation_object_held(resv));
> -             if (!ef)
> -                     (*ef_list)[k++] = to_amdgpu_amdkfd_fence(f);
> -             else
> -                     dma_fence_put(f);
> +             dma_fence_put(f);
>       }
>       kfree_rcu(old, rcu);
>   
>       return 0;
>   }
>   
> -/* amdgpu_amdkfd_add_eviction_fence - Adds eviction fence(s) back into BO's
> - *  reservation object.
> - *
> - * @bo: [IN] Add eviction fences to this BO
> - * @ef_list: [IN] List of eviction fences to be added
> - * @ef_count: [IN] Number of fences in ef_list.
> - *
> - * NOTE: Must call amdgpu_amdkfd_remove_eviction_fence before calling this
> - *  function.
> - */
> -static void amdgpu_amdkfd_add_eviction_fence(struct amdgpu_bo *bo,
> -                             struct amdgpu_amdkfd_fence **ef_list,
> -                             unsigned int ef_count)
> -{
> -     int i;
> -
> -     if (!ef_list || !ef_count)
> -             return;
> -
> -     for (i = 0; i < ef_count; i++) {
> -             amdgpu_bo_fence(bo, &ef_list[i]->base, true);
> -             /* Re-adding the fence takes an additional reference. Drop that
> -              * reference.
> -              */
> -             dma_fence_put(&ef_list[i]->base);
> -     }
> -
> -     kfree(ef_list);
> -}
> -
>   static int amdgpu_amdkfd_bo_validate(struct amdgpu_bo *bo, uint32_t domain,
>                                    bool wait)
>   {
> @@ -346,18 +284,8 @@ static int amdgpu_amdkfd_bo_validate(struct amdgpu_bo 
> *bo, uint32_t domain,
>       ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
>       if (ret)
>               goto validate_fail;
> -     if (wait) {
> -             struct amdgpu_amdkfd_fence **ef_list;
> -             unsigned int ef_count;
> -
> -             ret = amdgpu_amdkfd_remove_eviction_fence(bo, NULL, &ef_list,
> -                                                       &ef_count);
> -             if (ret)
> -                     goto validate_fail;
> -
> +     if (wait)
>               amdgpu_bo_sync_wait(bo, AMDGPU_FENCE_OWNER_KFD, false);
> -             amdgpu_amdkfd_add_eviction_fence(bo, ef_list, ef_count);
> -     }
>   
>   validate_fail:
>       return ret;
> @@ -444,7 +372,6 @@ static int add_bo_to_vm(struct amdgpu_device *adev, 
> struct kgd_mem *mem,
>   {
>       int ret;
>       struct kfd_bo_va_list *bo_va_entry;
> -     struct amdgpu_bo *pd = vm->root.base.bo;
>       struct amdgpu_bo *bo = mem->bo;
>       uint64_t va = mem->va;
>       struct list_head *list_bo_va = &mem->bo_va_list;
> @@ -484,14 +411,8 @@ static int add_bo_to_vm(struct amdgpu_device *adev, 
> struct kgd_mem *mem,
>               *p_bo_va_entry = bo_va_entry;
>   
>       /* Allocate new page tables if needed and validate
> -      * them. Clearing of new page tables and validate need to wait
> -      * on move fences. We don't want that to trigger the eviction
> -      * fence, so remove it temporarily.
> +      * them.
>        */
> -     amdgpu_amdkfd_remove_eviction_fence(pd,
> -                                     vm->process_info->eviction_fence,
> -                                     NULL, NULL);
> -
>       ret = amdgpu_vm_alloc_pts(adev, vm, va, amdgpu_bo_size(bo));
>       if (ret) {
>               pr_err("Failed to allocate pts, err=%d\n", ret);
> @@ -504,13 +425,9 @@ static int add_bo_to_vm(struct amdgpu_device *adev, 
> struct kgd_mem *mem,
>               goto err_alloc_pts;
>       }
>   
> -     /* Add the eviction fence back */
> -     amdgpu_bo_fence(pd, &vm->process_info->eviction_fence->base, true);
> -
>       return 0;
>   
>   err_alloc_pts:
> -     amdgpu_bo_fence(pd, &vm->process_info->eviction_fence->base, true);
>       amdgpu_vm_bo_rmv(adev, bo_va_entry->bo_va);
>       list_del(&bo_va_entry->bo_list);
>   err_vmadd:
> @@ -809,24 +726,11 @@ static int unmap_bo_from_gpuvm(struct amdgpu_device 
> *adev,
>   {
>       struct amdgpu_bo_va *bo_va = entry->bo_va;
>       struct amdgpu_vm *vm = bo_va->base.vm;
> -     struct amdgpu_bo *pd = vm->root.base.bo;
>   
> -     /* Remove eviction fence from PD (and thereby from PTs too as
> -      * they share the resv. object). Otherwise during PT update
> -      * job (see amdgpu_vm_bo_update_mapping), eviction fence would
> -      * get added to job->sync object and job execution would
> -      * trigger the eviction fence.
> -      */
> -     amdgpu_amdkfd_remove_eviction_fence(pd,
> -                                         vm->process_info->eviction_fence,
> -                                         NULL, NULL);
>       amdgpu_vm_bo_unmap(adev, bo_va, entry->va);
>   
>       amdgpu_vm_clear_freed(adev, vm, &bo_va->last_pt_update);
>   
> -     /* Add the eviction fence back */
> -     amdgpu_bo_fence(pd, &vm->process_info->eviction_fence->base, true);
> -
>       amdgpu_sync_fence(NULL, sync, bo_va->last_pt_update, false);
>   
>       return 0;
> @@ -1389,8 +1293,7 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
>        * attached
>        */
>       amdgpu_amdkfd_remove_eviction_fence(mem->bo,
> -                                     process_info->eviction_fence,
> -                                     NULL, NULL);
> +                                     process_info->eviction_fence);
>       pr_debug("Release VA 0x%llx - 0x%llx\n", mem->va,
>               mem->va + bo_size * (1 + mem->aql_queue));
>   
> @@ -1617,8 +1520,7 @@ int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
>       if (mem->mapped_to_gpu_memory == 0 &&
>           !amdgpu_ttm_tt_get_usermm(mem->bo->tbo.ttm) && !mem->bo->pin_count)
>               amdgpu_amdkfd_remove_eviction_fence(mem->bo,
> -                                             process_info->eviction_fence,
> -                                                 NULL, NULL);
> +                                             process_info->eviction_fence);
>   
>   unreserve_out:
>       unreserve_bo_and_vms(&ctx, false, false);
> @@ -1679,7 +1581,7 @@ int amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct 
> kgd_dev *kgd,
>       }
>   
>       amdgpu_amdkfd_remove_eviction_fence(
> -             bo, mem->process_info->eviction_fence, NULL, NULL);
> +             bo, mem->process_info->eviction_fence);
>       list_del_init(&mem->validate_list.head);
>   
>       if (size)
> @@ -1945,16 +1847,6 @@ static int validate_invalid_user_pages(struct 
> amdkfd_process_info *process_info)
>   
>       amdgpu_sync_create(&sync);
>   
> -     /* Avoid triggering eviction fences when unmapping invalid
> -      * userptr BOs (waits for all fences, doesn't use
> -      * FENCE_OWNER_VM)
> -      */
> -     list_for_each_entry(peer_vm, &process_info->vm_list_head,
> -                         vm_list_node)
> -             amdgpu_amdkfd_remove_eviction_fence(peer_vm->root.base.bo,
> -                                             process_info->eviction_fence,
> -                                             NULL, NULL);
> -
>       ret = process_validate_vms(process_info);
>       if (ret)
>               goto unreserve_out;
> @@ -2015,10 +1907,6 @@ static int validate_invalid_user_pages(struct 
> amdkfd_process_info *process_info)
>       ret = process_update_pds(process_info, &sync);
>   
>   unreserve_out:
> -     list_for_each_entry(peer_vm, &process_info->vm_list_head,
> -                         vm_list_node)
> -             amdgpu_bo_fence(peer_vm->root.base.bo,
> -                             &process_info->eviction_fence->base, true);
>       ttm_eu_backoff_reservation(&ticket, &resv_list);
>       amdgpu_sync_wait(&sync, false);
>       amdgpu_sync_free(&sync);
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to