[PATCH] drm/amdgpu: fix error handling in amdgpu_vm_init

Alex Deucher alexdeucher at gmail.com
Tue Oct 31 15:18:55 UTC 2023


On Tue, Oct 31, 2023 at 11:12 AM Christian König
<ckoenig.leichtzumerken at gmail.com> wrote:
>
> When clearing the root PD fails we need to properly release it again.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>

Acked-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 31 +++++++++++++-------------
>  1 file changed, 16 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index d72daf15662f..5877f6e9b893 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -2042,7 +2042,8 @@ long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout)
>   * Returns:
>   * 0 for success, error for failure.
>   */
> -int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, int32_t xcp_id)
> +int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
> +                  int32_t xcp_id)
>  {
>         struct amdgpu_bo *root_bo;
>         struct amdgpu_bo_vm *root;
> @@ -2061,6 +2062,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, int32_t xcp
>         INIT_LIST_HEAD(&vm->done);
>         INIT_LIST_HEAD(&vm->pt_freed);
>         INIT_WORK(&vm->pt_free_work, amdgpu_vm_pt_free_work);
> +       INIT_KFIFO(vm->faults);
>
>         /* create scheduler entities for page table updates */
>         r = drm_sched_entity_init(&vm->immediate, DRM_SCHED_PRIORITY_NORMAL,
> @@ -2103,34 +2105,33 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, int32_t xcp
>                                 false, &root, xcp_id);
>         if (r)
>                 goto error_free_delayed;
> -       root_bo = &root->bo;
> +
> +       root_bo = amdgpu_bo_ref(&root->bo);
>         r = amdgpu_bo_reserve(root_bo, true);
> -       if (r)
> -               goto error_free_root;
> +       if (r) {
> +               amdgpu_bo_unref(&root->shadow);
> +               amdgpu_bo_unref(&root_bo);
> +               goto error_free_delayed;
> +       }
>
> +       amdgpu_vm_bo_base_init(&vm->root, vm, root_bo);
>         r = dma_resv_reserve_fences(root_bo->tbo.base.resv, 1);
>         if (r)
> -               goto error_unreserve;
> -
> -       amdgpu_vm_bo_base_init(&vm->root, vm, root_bo);
> +               goto error_free_root;
>
>         r = amdgpu_vm_pt_clear(adev, vm, root, false);
>         if (r)
> -               goto error_unreserve;
> +               goto error_free_root;
>
>         amdgpu_bo_unreserve(vm->root.bo);
> -
> -       INIT_KFIFO(vm->faults);
> +       amdgpu_bo_unref(&root_bo);
>
>         return 0;
>
> -error_unreserve:
> -       amdgpu_bo_unreserve(vm->root.bo);
> -
>  error_free_root:
> -       amdgpu_bo_unref(&root->shadow);
> +       amdgpu_vm_pt_free_root(adev, vm);
> +       amdgpu_bo_unreserve(vm->root.bo);
>         amdgpu_bo_unref(&root_bo);
> -       vm->root.bo = NULL;
>
>  error_free_delayed:
>         dma_fence_put(vm->last_tlb_flush);
> --
> 2.34.1
>


More information about the amd-gfx mailing list