Re: [PATCH v2] drm/amdgpu: fix clearing mappings for BOs that are always valid in VM

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

 



Applied.  Thanks!

Alex

On Fri, Jun 16, 2023 at 9:38 AM Samuel Pitoiset
<samuel.pitoiset@xxxxxxxxx> wrote:
>
> Per VM BOs must be marked as moved or otherwise their ranges are not
> updated on use which might be necessary when the replace operation
> splits mappings.
>
> This fixes random GPU hangs when replacing sparse mappings from the
> userspace, while OP_MAP/OP_UNMAP works fine because always valid BOs
> are correctly handled there.
>
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset@xxxxxxxxx>
> Reviewed-by: Christian König <christian.koenig@xxxxxxx>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 143d11afe0e5..eff73c428b12 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -1771,18 +1771,30 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
>
>         /* Insert partial mapping before the range */
>         if (!list_empty(&before->list)) {
> +               struct amdgpu_bo *bo = before->bo_va->base.bo;
> +
>                 amdgpu_vm_it_insert(before, &vm->va);
>                 if (before->flags & AMDGPU_PTE_PRT)
>                         amdgpu_vm_prt_get(adev);
> +
> +               if (bo && bo->tbo.base.resv == vm->root.bo->tbo.base.resv &&
> +                   !before->bo_va->base.moved)
> +                       amdgpu_vm_bo_moved(&before->bo_va->base);
>         } else {
>                 kfree(before);
>         }
>
>         /* Insert partial mapping after the range */
>         if (!list_empty(&after->list)) {
> +               struct amdgpu_bo *bo = after->bo_va->base.bo;
> +
>                 amdgpu_vm_it_insert(after, &vm->va);
>                 if (after->flags & AMDGPU_PTE_PRT)
>                         amdgpu_vm_prt_get(adev);
> +
> +               if (bo && bo->tbo.base.resv == vm->root.bo->tbo.base.resv &&
> +                   !after->bo_va->base.moved)
> +                       amdgpu_vm_bo_moved(&after->bo_va->base);
>         } else {
>                 kfree(after);
>         }
> --
> 2.41.0
>




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

  Powered by Linux