|
@@ -495,11 +495,12 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,
|
|
|
eaddr = eaddr & ((1 << shift) - 1);
|
|
|
|
|
|
flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
|
|
|
+ if (vm->root.base.bo->shadow)
|
|
|
+ flags |= AMDGPU_GEM_CREATE_SHADOW;
|
|
|
if (vm->use_cpu_for_update)
|
|
|
flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
|
|
|
else
|
|
|
- flags |= (AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
|
|
|
- AMDGPU_GEM_CREATE_SHADOW);
|
|
|
+ flags |= AMDGPU_GEM_CREATE_NO_CPU_ACCESS;
|
|
|
|
|
|
/* walk over the address space and allocate the page tables */
|
|
|
for (pt_idx = from; pt_idx <= to; ++pt_idx) {
|
|
@@ -2587,7 +2588,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
|
|
flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
|
|
|
if (vm->use_cpu_for_update)
|
|
|
flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
|
|
|
- else
|
|
|
+ else if (vm_context != AMDGPU_VM_CONTEXT_COMPUTE)
|
|
|
flags |= AMDGPU_GEM_CREATE_SHADOW;
|
|
|
|
|
|
size = amdgpu_vm_bo_size(adev, adev->vm_manager.root_level);
|
|
@@ -2662,8 +2663,7 @@ error_free_sched_entity:
|
|
|
* - pasid (old PASID is released, because compute manages its own PASIDs)
|
|
|
*
|
|
|
* Reinitializes the page directory to reflect the changed ATS
|
|
|
- * setting. May leave behind an unused shadow BO for the page
|
|
|
- * directory when switching from SDMA updates to CPU updates.
|
|
|
+ * setting.
|
|
|
*
|
|
|
* Returns:
|
|
|
* 0 for success, -errno for errors.
|
|
@@ -2713,6 +2713,9 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
|
|
|
vm->pasid = 0;
|
|
|
}
|
|
|
|
|
|
+ /* Free the shadow bo for compute VM */
|
|
|
+ amdgpu_bo_unref(&vm->root.base.bo->shadow);
|
|
|
+
|
|
|
error:
|
|
|
amdgpu_bo_unreserve(vm->root.base.bo);
|
|
|
return r;
|