Comments inline.

On 2019-02-19 8:40 a.m., Christian König wrote:
> This way we only deal with the real BO in here.
>
> Signed-off-by: Christian König <christian.koe...@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 64 ++++++++++++++++----------
>   1 file changed, 39 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 12d51d96491e..3c7b98a758c9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -788,38 +788,58 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device 
> *adev,
>   
>       r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
>       if (r)
> -             goto error;
> +             return r;
>   
>       r = amdgpu_ttm_alloc_gart(&bo->tbo);
>       if (r)
>               return r;
>   
> +     if (bo->shadow) {
> +             r = ttm_bo_validate(&bo->shadow->tbo, &bo->shadow->placement,
> +                                 &ctx);
> +             if (r)
> +                     return r;
> +
> +             r = amdgpu_ttm_alloc_gart(&bo->shadow->tbo);
> +             if (r)
> +                     return r;
> +
> +     }
> +
>       r = amdgpu_job_alloc_with_ib(adev, 64, &job);

I guess that's still big enough to fit 4 instead of 2 SDMA commands (10 
dwords each).


>       if (r)
> -             goto error;
> +             return r;
>   
> -     addr = amdgpu_bo_gpu_offset(bo);
> -     if (ats_entries) {
> -             uint64_t ats_value;
> +     while (1) {
> +             addr = amdgpu_bo_gpu_offset(bo);
> +             if (ats_entries) {
> +                     uint64_t ats_value;
>   
> -             ats_value = AMDGPU_PTE_DEFAULT_ATC;
> -             if (level != AMDGPU_VM_PTB)
> -                     ats_value |= AMDGPU_PDE_PTE;
> +                     ats_value = AMDGPU_PTE_DEFAULT_ATC;
> +                     if (level != AMDGPU_VM_PTB)
> +                             ats_value |= AMDGPU_PDE_PTE;
>   
> -             amdgpu_vm_set_pte_pde(adev, &job->ibs[0], addr, 0,
> -                                   ats_entries, 0, ats_value);
> -             addr += ats_entries * 8;
> -     }
> +                     amdgpu_vm_set_pte_pde(adev, &job->ibs[0], addr, 0,
> +                                           ats_entries, 0, ats_value);
> +                     addr += ats_entries * 8;
> +             }
>   
> -     if (entries) {
> -             uint64_t value = 0;
> +             if (entries) {
> +                     uint64_t value = 0;
>   
> -             /* Workaround for fault priority problem on GMC9 */
> -             if (level == AMDGPU_VM_PTB && adev->asic_type >= CHIP_VEGA10)
> -                     value = AMDGPU_PTE_EXECUTABLE;
> +                     /* Workaround for fault priority problem on GMC9 */
> +                     if (level == AMDGPU_VM_PTB &&
> +                         adev->asic_type >= CHIP_VEGA10)
> +                             value = AMDGPU_PTE_EXECUTABLE;
> +
> +                     amdgpu_vm_set_pte_pde(adev, &job->ibs[0], addr, 0,
> +                                           entries, 0, value);
> +             }
>   
> -             amdgpu_vm_set_pte_pde(adev, &job->ibs[0], addr, 0,
> -                                   entries, 0, value);
> +             if (bo->shadow)
> +                     bo = bo->shadow;
> +             else
> +                     break;
>       }

Instead of a while(1) endless loop, this could be written as a do ... 
while loop with a sane termination condition like this:

        do {
                ...
                bo = bo->shadow;
        } while (bo);

Assuming that you don't need "bo" after this. You do below, but I think 
that's a mistake anyway. See the next comment.

>   
>       amdgpu_ring_pad_ib(ring, &job->ibs[0]);
> @@ -838,16 +858,10 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device 
> *adev,
>       amdgpu_bo_fence(bo, fence, true);

Here you'll only fence the shadow BO.

Regards,
   Felix


>       dma_fence_put(fence);
>   
> -     if (bo->shadow)
> -             return amdgpu_vm_clear_bo(adev, vm, bo->shadow,
> -                                       level, pte_support_ats);
> -
>       return 0;
>   
>   error_free:
>       amdgpu_job_free(job);
> -
> -error:
>       return r;
>   }
>   
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to