drm/amdgpu: fix clearing mappings for BOs that are always valid in VM
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@vger.kernel.org Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Родитель
03d400e760
Коммит
ea2c3c0855
|
@ -1771,18 +1771,30 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
|
||||||
|
|
||||||
/* Insert partial mapping before the range */
|
/* Insert partial mapping before the range */
|
||||||
if (!list_empty(&before->list)) {
|
if (!list_empty(&before->list)) {
|
||||||
|
struct amdgpu_bo *bo = before->bo_va->base.bo;
|
||||||
|
|
||||||
amdgpu_vm_it_insert(before, &vm->va);
|
amdgpu_vm_it_insert(before, &vm->va);
|
||||||
if (before->flags & AMDGPU_PTE_PRT)
|
if (before->flags & AMDGPU_PTE_PRT)
|
||||||
amdgpu_vm_prt_get(adev);
|
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 {
|
} else {
|
||||||
kfree(before);
|
kfree(before);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insert partial mapping after the range */
|
/* Insert partial mapping after the range */
|
||||||
if (!list_empty(&after->list)) {
|
if (!list_empty(&after->list)) {
|
||||||
|
struct amdgpu_bo *bo = after->bo_va->base.bo;
|
||||||
|
|
||||||
amdgpu_vm_it_insert(after, &vm->va);
|
amdgpu_vm_it_insert(after, &vm->va);
|
||||||
if (after->flags & AMDGPU_PTE_PRT)
|
if (after->flags & AMDGPU_PTE_PRT)
|
||||||
amdgpu_vm_prt_get(adev);
|
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 {
|
} else {
|
||||||
kfree(after);
|
kfree(after);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче