RE: [PATCH 1/2] drm/amdgpu: make sure BOs are locked in amdgpu_vm_get_memory

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[Public]

Acked-by: Guchun Chen <guchun.chen@xxxxxxx> for this series.

A simple question is we don't need to hold the lock if bo locations are not changed?

Regards,
Guchun

> -----Original Message-----
> From: Christian König <ckoenig.leichtzumerken@xxxxxxxxx>
> Sent: Monday, June 5, 2023 5:11 PM
> To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx; mikhail.v.gavrilov@xxxxxxxxx; Chen,
> Guchun <Guchun.Chen@xxxxxxx>
> Subject: [PATCH 1/2] drm/amdgpu: make sure BOs are locked in
> amdgpu_vm_get_memory
>
> We need to grab the lock of the BO or otherwise can run into a crash when
> we try to inspect the current location.
>
> Signed-off-by: Christian König <christian.koenig@xxxxxxx>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 69 +++++++++++++++---------
> --
>  1 file changed, 39 insertions(+), 30 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 3c0310576b3b..2c8cafec48a4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -920,42 +920,51 @@ int amdgpu_vm_update_range(struct
> amdgpu_device *adev, struct amdgpu_vm *vm,
>       return r;
>  }
>
> +static void amdgpu_vm_bo_get_memory(struct amdgpu_bo_va *bo_va,
> +                                 struct amdgpu_mem_stats *stats) {
> +     struct amdgpu_vm *vm = bo_va->base.vm;
> +     struct amdgpu_bo *bo = bo_va->base.bo;
> +
> +     if (!bo)
> +             return;
> +
> +     /*
> +      * For now ignore BOs which are currently locked and potentially
> +      * changing their location.
> +      */
> +     if (bo->tbo.base.resv != vm->root.bo->tbo.base.resv &&
> +         !dma_resv_trylock(bo->tbo.base.resv))
> +             return;
> +
> +     amdgpu_bo_get_memory(bo, stats);
> +     if (bo->tbo.base.resv != vm->root.bo->tbo.base.resv)
> +         dma_resv_unlock(bo->tbo.base.resv);
> +}
> +
>  void amdgpu_vm_get_memory(struct amdgpu_vm *vm,
>                         struct amdgpu_mem_stats *stats)
>  {
>       struct amdgpu_bo_va *bo_va, *tmp;
>
>       spin_lock(&vm->status_lock);
> -     list_for_each_entry_safe(bo_va, tmp, &vm->idle, base.vm_status) {
> -             if (!bo_va->base.bo)
> -                     continue;
> -             amdgpu_bo_get_memory(bo_va->base.bo, stats);
> -     }
> -     list_for_each_entry_safe(bo_va, tmp, &vm->evicted, base.vm_status)
> {
> -             if (!bo_va->base.bo)
> -                     continue;
> -             amdgpu_bo_get_memory(bo_va->base.bo, stats);
> -     }
> -     list_for_each_entry_safe(bo_va, tmp, &vm->relocated,
> base.vm_status) {
> -             if (!bo_va->base.bo)
> -                     continue;
> -             amdgpu_bo_get_memory(bo_va->base.bo, stats);
> -     }
> -     list_for_each_entry_safe(bo_va, tmp, &vm->moved, base.vm_status)
> {
> -             if (!bo_va->base.bo)
> -                     continue;
> -             amdgpu_bo_get_memory(bo_va->base.bo, stats);
> -     }
> -     list_for_each_entry_safe(bo_va, tmp, &vm->invalidated,
> base.vm_status) {
> -             if (!bo_va->base.bo)
> -                     continue;
> -             amdgpu_bo_get_memory(bo_va->base.bo, stats);
> -     }
> -     list_for_each_entry_safe(bo_va, tmp, &vm->done, base.vm_status) {
> -             if (!bo_va->base.bo)
> -                     continue;
> -             amdgpu_bo_get_memory(bo_va->base.bo, stats);
> -     }
> +     list_for_each_entry_safe(bo_va, tmp, &vm->idle, base.vm_status)
> +             amdgpu_vm_bo_get_memory(bo_va, stats);
> +
> +     list_for_each_entry_safe(bo_va, tmp, &vm->evicted, base.vm_status)
> +             amdgpu_vm_bo_get_memory(bo_va, stats);
> +
> +     list_for_each_entry_safe(bo_va, tmp, &vm->relocated,
> base.vm_status)
> +             amdgpu_vm_bo_get_memory(bo_va, stats);
> +
> +     list_for_each_entry_safe(bo_va, tmp, &vm->moved, base.vm_status)
> +             amdgpu_vm_bo_get_memory(bo_va, stats);
> +
> +     list_for_each_entry_safe(bo_va, tmp, &vm->invalidated,
> base.vm_status)
> +             amdgpu_vm_bo_get_memory(bo_va, stats);
> +
> +     list_for_each_entry_safe(bo_va, tmp, &vm->done, base.vm_status)
> +             amdgpu_vm_bo_get_memory(bo_va, stats);
>       spin_unlock(&vm->status_lock);
>  }
>
> --
> 2.34.1





[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux