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

Christian König ckoenig.leichtzumerken at gmail.com
Fri Jun 16 12:55:32 UTC 2023


Am 16.06.23 um 08:27 schrieb Samuel Pitoiset:
> If the BO has been moved the PT should be updated, otherwise the VAs
> might point to invalid PT.

You might want to update this sentence a bit. Something like:

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.

Apart from that really good catch and the patch is Reviewed-by: 
Christian König <christian.koenig at amd.com>

Regards,
Christian.

>
> 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 at vger.kernel.org
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>   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);
>   	}



More information about the amd-gfx mailing list